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 中找到它们。