DB2中的Merge语句可以将一个表中的数据合并到另一个表中,在合并的同时可以根据条件进行插入、删除、更新等操作,功能非常强大。
MERGE INTO table_name alias1
USING (table|view|sub_query) alias2
ON (join condition)
WHEN MATCHED THEN
UPDATE table_name SET col1 = col_val1,col2 = col2_val
WHEN NOT MATCHED THEN
INSERT (column_list) VALUES (column_values)
关键字、参数
into子句
在into子句中指定所要修改或者插入数据的目标表
using子句
在using子句中指定用来修改或者插入的数据源。数据源可以是表、视图或者一个子查询语句。
on子句
在on子句中指定执行插入或者修改的满足条件。
when matched | not matched
用该子句通知数据库如何对满足或不满足条件的结果做出相应的操作。可以使用以下的两类子句。
有数据就更新或删除,无数据就插入。
merge_update子句
merge_update子句执行对目标表中的字段值修改。当在符合on子句条件的情况下执行。如果修改子句执行,则目标表上的修改触发器将被触发。
限制:当修改一个视图时,不能指定一个default值
merge_insert 子句
merge_insert子句执行当不符合on子句条件时,往目标表中插入数据。如果插入子句执行,则目标表上插入触发器将被触发。
限制:当修改一个视图时,不能指定一个default值
示例1:merge into 表 using(子查询)
MERGE INTO BONUSES D
USING(SELECT EMPLOYEE_ID,SALARY,DEPARTMENT_ID FROM EMPLOYEES WHERE DEPARTMENT_ID=80) S
ON (D.EMPLOYEE_ID = S.EMPLOYEE_ID)
WHEN MATCHED THEN UPDATE SET D.BONUS = D.BONUS + S.SALARY*.01
WHEN NOT MATCHED THEN INSERT (D.EMPLOYEE_ID, D.BONUS)
VALUES (S.EMPLOYEE_ID, S.SALARY*0.01);
示例2、 merge into 表 using table
MERGE INTO XCMDTRANSFERSTATE AS T
USING TABLE (VALUES(?,?,?,?,?,?)) T1(DATASNO,EXTERIORSYSTEM,STATUS,DATA_TIME,MARKFORDELETE,DATATRANSFERNO)
ON (T.DATATRANSFERNO = T1.DATATRANSFERNO)
WHEN MATCHED THEN update set T.DATASNO = T1.DATASNO,
T.EXTERIORSYSTEM = T1.EXTERIORSYSTEM,
T.STATUS = T1.STATUS,
T.LASTUP_TIME = T1.DATA_TIME,
T.MARKFORDELETE = T1.MARKFORDELETE
WHEN NOT MATCHED THEN
INSERT (DATASNO,EXTERIORSYSTEM,STATUS,CREATE_TIME,MARKFORDELETE,DATATRANSFERNO)
VALUES (T1.DATASNO,T1.EXTERIORSYSTEM,T1.STATUS,T1.DATA_TIME,T1.MARKFORDELETE,T1.DATATRANSFERNO)
示例3、 merge into 表1 using 表2
MERGE INTO EMPLOYE AS EM
USING MANAGER AS MA
ON EM.EMPLOYEID=MA.MANAGERID
WHEN MATCHED AND EM.SALARY<MA.SALARY THEN UPDATE SET EM.SALARY=MA.SALARY
WHEN MATCHED AND EM.SALARY>MA.SALARY THEN SIGNAL SQLSTATE '70001'
SET MESSAGE_TEXT = 'EM.SALARY>MA.SALARY'
WHEN NOT MATCHED THEN INSERT VALUES (MA.MANAGERID,MA.NAME,MA.SALARY)
与update的区别
一,共同点
1.都可以做更新操作
二、不同点
1.merge可以同时做插入(not matched的时候)
2.merge不会强制要求不被更新的表具有唯一或者主键约束
例如merge a using b on (…), 这里不会要求b具有唯一约束或者主键约束。当然肯定还是要求b只能返回一条记录。
很多update语句调整为等效语句的时候会遇到这种强制约束的问题,但merge不存在。
3.在某些情况下,merge效率更高。—查看执行计划
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/37001.html