2023年12月14日發(作者:殺病毒)

db2mergeinto語法
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子句條件的情況下執行。如果修改子句執行,則目標表上的修改觸發器將被觸發。
merge_update子句
merge_update子句執行對目標表中的字段值修改。當在符合on子句條件的情況下執行。如果修改子句執行,則目標表上的修改觸發器將被觸發。
限制:當修改一個視圖時,不能指定一個default值
merge_inrt 子句
merge_inrt子句執行當不符合on子句條件時,往目標表中插入數據。如果插入子句執行,則目標表上插入觸發器將被觸發。
限制:當修改一個視圖時,不能指定一個default值
MERGE INTO BONUSES D
USING (SELECT EMPLOYEE_ID, SALARY, DEPARTMENT_ID FROM EMPLOYEES WHERE DEPARTMENT_ID = 80) S
ON (EE_ID = EE_ID)
WHEN MATCHED THEN UPDATE SET = + *.01
WHEN NOT MATCHED THEN INSERT (EE_ID, ) VALUES (EE_ID, *0.01);
MERGE INTO XCMDTRANSFERSTATE AS T
USING TABLE (VALUES(?,?,?,?,?,?)) T1(DATASNO,EXTERIORSYSTEM,STATUS,DATA_TIME,MARKFORDELETE,DATATRANSFERNO)
ON (ANSFERNO = ANSFERNO)
WHEN MATCHED THEN update t O = O,ORSYSTEM = ORSYSTEM, =
,_TIME = _TIME,RDELETE = RDELETE
WHEN NOT MATCHED THEN INSERT (DATASNO,EXTERIORSYSTEM,STATUS,CREATE_TIME,MARKFORDELETE,DATATRANSFERNO) VALUES
(O,ORSYSTEM,,_TIME,RDELETE,ANSFERNO
MERGE INTO EMPLOYE AS EM
USING MANAGER AS MA
ON EID=RID
WHEN MATCHED AND < THEN UPDATE SET =
WHEN MATCHED AND > THEN SIGNAL SQLSTATE '70001' SET MESSAGE_TEXT = '>'
WHEN NOT MATCHED THEN INSERT VALUES (RID,,)
ELSE IGNORE;
-----
DB2 Merge 語句的作用非常強大,它可以將一個表中的數據合并到另一個表中,在合并的同時可以進行插入、刪除、更新等操作。我們還
是先來看個簡單的例子吧,假設你定義了一個雇員表(employe),一個經理表(manager),如下所示:
---雇員表(EMPLOYE)
CREATE TABLE EMPLOYE (
EMPLOYEID INTEGER NOT NULL,---員工號
NAME VARCHAR(20) NOT NULL,---姓名
SALARY DOUBLE---薪水
);
INSERT INTO EMPLOYE (EMPLOYEID,NAME,SALARY) VALUES
(1,'張三',1000),
(2,'李四',2000),
(3,'王五',3000),
(4,'趙六',4000),
(5,'高七',5000);
--經理表(MANAGER)
CREATE TABLE MANAGER (
EMPLOYEID INTEGER NOT NULL,---經理號
NAME VARCHAR(20) NOT NULL,---姓名
SALARY DOUBLE---薪水
);
INSERT INTO MANAGER (MANAGERID,NAME,SALARY) VALUES
(3,'王五',5000),
(4,'趙六',6000);
經過一段時間,你發現這樣的數據模型,或者說表結構設計簡直就是一大敗筆,經理和雇員都是員工嘛,為什么要設計兩個表呢?發現錯誤
后就需要改正,所以你決定,刪除經理表(MANAGER)表,將MANAGER 表中的數據合并到EMPLOYE 表中,仔細分析發現,王五在兩
個表中都存在(可能是干的好升官了),而劉八在EMPLOYE 表中并不存在,現在,我們要求把EMPLOYE 表中不存在的MANAGER都插
入到EMPLOYE 表中,存在的更新薪水。該怎么辦呢?這個問題并不難,通常,我們可以分兩步,如下所示:
--更新存在的
UPDATE EMPLOYE AS EM SET SALARY=(SELECT SALARY FROM MANAGER WHERE MANAGERID=EID)
WHERE EMPLOYEID IN (
SELECT MANAGERID FROM MANAGER
);
---插入不存在的
INSERT INTO EMPLOYE (EMPLOYEID,NAME,SALARY)
SELECT MANAGERID,NAME,SALARY FROM MANAGER WHERE MANAGERID NOT IN (
SELECT EMPLOYEID FROM EMPLOYE
);
上面的處理是可以的,但是我們還可以有更簡單的方法,就是用Merge語句,如下所示:
MERGE INTO EMPLOYE AS EM
USING MANAGER AS MA
ON EID=RID
WHEN MATCHED THEN UPDATE SET =
WHEN NOT MATCHED THEN INSERT VALUES (RID,,);
在上面的處理中,我們用經理表(MANAGER)的薪水更新了雇員表(EMPLOYE)的薪水,假設現在要求,如果經理表(MANAGER)的
薪水>雇員表(EMPLOYE)的薪水的時候更新,否則不更新,怎么辦呢?如下:
-1
MERGE INTO EMPLOYE AS EM
USING MANAGER AS MA
ON EID=RID
WHEN MATCHED AND < THEN UPDATE SET =
WHEN NOT MATCHED THEN INSERT VALUES (RID,,);
-2
USING MANAGER AS MA
ON EID=RID
WHEN MATCHED AND < THEN UPDATE SET =
WHEN NOT MATCHED THEN INSERT VALUES (RID,,)
el ignore
不仔細的朋友可能沒有看出上面兩條語句的區別,哈哈,請仔細對比一下這兩條語句。上面的語句中多了ELSE IGNORE語句,它的意思正
如它英文的意思,其它情況忽略不處理。
如果你認為理論上應該不存在>的數據,如果有,說明有問題,你想拋個異常,怎么辦?如下:
MERGE INTO EMPLOYE AS EM
USING MANAGER AS MA
ON EID=RID
WHEN MATCHED AND < THEN UPDATE SET =
WHEN MATCHED AND > THEN SIGNAL SQLSTATE '70001' SET MESSAGE_TEXT =
'>'
WHEN NOT MATCHED THEN INSERT VALUES (RID,,)
ELSE IGNORE;
對于>的情況,如果你不想拋異常,而是刪除EMPLOYE中的數據,怎么辦?如下:
MERGE INTO EMPLOYE AS EM
USING MANAGER AS MA
ON EID=RID
WHEN MATCHED AND < THEN UPDATE SET =
WHEN MATCHED AND > THEN DELETE
WHEN NOT MATCHED THEN INSERT VALUES (RID,,)
ELSE IGNORE;
本文發布于:2023-12-14 05:10:28,感謝您對本站的認可!
本文鏈接:http://www.newhan.cn/zhishi/a/1702501829245876.html
版權聲明:本站內容均來自互聯網,僅供演示用,請勿用于商業和其他非法用途。如果侵犯了您的權益請與我們聯系,我們將在24小時內刪除。
本文word下載地址:db2mergeinto語法.doc
本文 PDF 下載地址:db2mergeinto語法.pdf
| 留言與評論(共有 0 條評論) |