DB2 MERGE INTO語句的使用
DB2中的Merge語句可以將一個表中的數據合並到另一個表中,在合並的同時可以根據條件進行插入、刪除、更新等操作,功能非常強大。
語法如下:www.2cto.com
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值
示例:
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);
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
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)
ELSE IGNORE;