oracle:MERGE语句

将源表添加到目标表,如果目标表中行已经存在,可以更新数据,如果不存在,可以插入数据。

之所以说可以,因为更新、插入操作都是要自己写的。 - -!

9i 时必须update insert 都有,10g以后至少有一个

MERGE INTO target_table_name tar_t
USING source_table_name sou_t ON
(expr1)
WHEN MATCHED THEN
expr2
WHEN NOT MATCHED THEN
expr3;

(这只是一条sql 语句 - -!)

expr1 为判断语句,例如 tar_t.id = sou_t.id
expr2 为目标行存在的操作, 例如 UPDATE SET xxxx [WHERE xxx]  [DELETE WHERE (xxx)]

expr3 为不存在时的操作,例如INSERT VALUES (xxxx) [WHERE xxx] 

WHEN 语句只写一个,那么另外的那个将被忽略

expr1时可以对UPDATE加WHERE 操作,控制部分更新

UPDATE
SET expr1
WHERE xxx

where 操作只能在满足 ON 条件的数据下再一次选择
DELETE 语句只能删除 目标表的行,就算是特意指明是源表,也会删除目标表

而且DELETE语句一定在 WHERE 后面(如果存在),就是上面expr2 的格式

需要注意的是在UPDATE时出现多组源表数据对应目标表中的一行数据(这种情况可以通过primary key 解决)

如果expr1 中有空值做判断,不会跳入 MATCHED 和 NOT MATCHED

MERGE 可以做很多UPDATE 的操作

原文地址:https://www.cnblogs.com/Azhu/p/2439861.html