将源表添加到目标表,如果目标表中行已经存在,可以更新数据,如果不存在,可以插入数据。
之所以说可以,因为更新、插入操作都是要自己写的。 - -!
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 的操作