1. 场景
在写数据同步的脚本时,常常会遇到这样的需求:存在时 -> 更新,不存在时 -> 插入
2. merge into 语句
merge
是Oracle9i
新增的语法,根据源表对目标表进行匹配查询,匹配成功时更新,不成功时插入。- 比单独的
update + insert
的方式效率要更高,尤其是on
条件下有唯一索引的时候,效率更高。
语法
MERGE INTO 目标表 b
USING 源表 a
ON (b.字段1 = a.字段1 AND b.字段n = a.字段n) -- 必须带 ‘()’括号
WHEN MATCHED THEN -- 整体扫描,匹配时,执行此处
UPDATE 子句
WHEN NOT MATCHED THEN -- 整体扫描,不匹配时,执行此处
INSERT 子句;
示例
MERGE INTO stu_new b
USING stu_old a
ON (b.id = a.id)
WHEN MATCHED THEN
UPDATE SET b.name = a.name, b.sex = a.sex WHERE a.name <> '张三'
WHEN NOT MATCHED THEN
INSERT (b.id, b.name, b.sex) VALUES (a.id, a.name, a.sex) WHERE a.name = '张三';