使用 MERGE 语句更新表和视图内容

DB2® 数据库管理器能够使用来自另一个源的数据(通常是表引用的结果)更新表或视图。这种更新是使用 MERGE 语句来执行的。

可以根据 MERGE 语句中的指定指示信息删除或更新目标表中与源相匹配的行。可以插入目标表中不存在的行。

在视图中更新、删除或插入行会导致在视图所基于的表中更新、删除或插入相应行。

限制

与 MERGE 语句相关联的授权标识必须具有适当的特权才能执行以下三种可能操作中的任何一种:对视图的目标表或基础表的更新、删除或插入操作。授权标识还应该对子查询中视图的表或基础表具有适当特权。

如果 MERGE 语句中发生了错误,则会回滚与 MERGE 相关联的整个操作集。

不能更新视图的目标表或基础表中在运行 MERGE 语句之前不存在的行。即,不允许更新作为 MERGE 语句的一部分插入的行。

如果将视图指定为 MERGE 语句的目标,则不应为该视图定义任何 INSTEAD OF 触发器;或者应为更新、删除和插入操作中的每一个定义 INSTEAD OF 触发器。

过程

要对目标表执行更新、删除、插入或这三种操作的任意组合,在命令提示符处输入下列内容:

 
 
MERGE INTO <table or view name>
USING <table reference> ON <search condition>
WHEN <match condition> THEN <modification operation or signal statement>
 

每个 MERGE 语句可多次指定修改操作和信号语句。在单个 MERGE 语句中只能对目标表或视图中的每行执行一次操作。这意味着目标表或视图中的某行仅可标识为与表引用的结果表中的一行“匹配”(MATCHED)。

考虑存在 shipment 和 inventory 两个表的情况。通过使用 shipment 表,将行合并到 inventory 表中。对于匹配的行,按照 shipment 表中的数量来增加 inventory 表中的数量。否则,将新部件号插入到 inventory 表中。

 
 
 MERGE INTO inventory AS in
 USING (SELECT partno, description, count FROM shipment
 WHERE shipment. partno IS NOT NULL) AS sh
 ON (in.partno = sh.partno)
 WHEN MATCHED THEN
         UPDATE SET
            description = sh.description
            quantity = in.quantity + sh.count
 WHEN NOT MATCHED THEN
        INSERT
            (partno, description, quantity)
            VALUES (sh.partno, sh.description, sh.count)
 

此示例中没有任何 DELETE 选项。较复杂的匹配条件可考虑添加 DELETE 选项。有几个其他选项(例如,使用信号语句和 ELSE 子句)在此处未作说明,但可在 SQL Reference 中找到它们。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值