Merge的用法
根据源表对目标表进行匹配查询,匹配成功时更新,不成功时插入
比单独的 update + insert 的方式效率要更高,尤其是on条件下有唯一索引的时候,效率更高
使用场景
存在时 - 更新,不存在时,插入
常用格式
MERGE INTO 目标表 a USING 源表 b ON (a.字段1 = b.字段2 and a.字段n = b.字段n) WHEN MATCHED THEN UPDATE SET a.新字段 = b.字段 WHERE 限制条件 WHEN NOT MATCHED THEN INSERT (a.字段名1,a.字段名n) VALUES(b.字段值1, b.字段值n) WHERE 限制条件
注意事项
- 不能更新ON子句引用的列
- DELETE子句的WHERE顺序必须最后
- DELETE 子句仅仅能够删除目标表。而无法删除源表
- 更新同一张表的数据,需操心USING的空值
- 必需要在源表中获得一组稳定的行
必需要在源表中获得一组稳定的行
例子
需求:从T1表更新数据到T2表中。假设T2表的NAME 在T1表中已存在,就将MONEY累加,假设不存在。将T1表的记录插入到T2表中。
MERGE INTO T2 USING T1 ON (T1.NAME=T2.NAME) WHEN MATCHED THEN UPDATE SET T2.MONEY=T1.MONEY+T2.MONEY WHEN NOT MATCHED THEN INSERT VALUES (T1.NAME,T1.MONEY)