|
Posted on 2011-10-18 15:42 Prayer 閱讀(784) 評論(0) 編輯 收藏 引用 所屬分類: 數(shù)據(jù)庫,SQL 、 DB2
DB2 Merge語句是經(jīng)常可以用到的DB2語句,下面對DB2 Merge語句作了詳細的介紹,如果您對此方面感興趣的話,不妨一看。
DB2 Merge語句的作用非常強大,它可以將一個表中的數(shù)據(jù)合并到另一個表中,在合并的同時可以進行插入、刪除、更新等操作。我們還是先來看個簡單的例子吧,假設(shè)你定義了一個雇員表(employe),一個經(jīng)理表(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); |
--經(jīng)理表(MANAGER)
以下是代碼片段: CREATE TABLE MANAGER ( EMPLOYEID INTEGER NOT NULL,---經(jīng)理號 NAME VARCHAR(20) NOT NULL,---姓名 SALARY DOUBLE---薪水 ); INSERT INTO MANAGER (MANAGERID,NAME,SALARY) VALUES (3,'王五',5000), (4,'趙六',6000); |
---雇員表(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); |
--經(jīng)理表(MANAGER)
以下是代碼片段: CREATE TABLE MANAGER ( EMPLOYEID INTEGER NOT NULL,---經(jīng)理號 NAME VARCHAR(20) NOT NULL,---姓名 SALARY DOUBLE---薪水 ); INSERT INTO MANAGER (MANAGERID,NAME,SALARY) VALUES (3,'王五',5000), (4,'趙六',6000); | 經(jīng)過一段時間,你發(fā)現(xiàn)這樣的數(shù)據(jù)模型,或者說表結(jié)構(gòu)設(shè)計簡直就是一大敗筆,經(jīng)理和雇員都是員工嘛,為什么要設(shè)計兩個表呢?發(fā)現(xiàn)錯誤后就需要改正,所以你決定,刪除經(jīng)理表(MANAGER)表,將MANAGER 表中的數(shù)據(jù)合并到EMPLOYE 表中,仔細分析發(fā)現(xiàn),王五在兩個表中都存在(可能是干的好升官了),而劉八在EMPLOYE 表中并不存在,現(xiàn)在,我們要求把EMPLOYE 表中不存在的MANAGER都插入到EMPLOYE 表中,存在的更新薪水。該怎么辦呢?這個問題并不難,通常,我們可以分兩步,如下所示:
--更新存在的
以下是代碼片段: UPDATE EMPLOYE AS EM SET SALARY=(SELECT SALARY FROM MANAGER WHERE MANAGERID=EM.EMPLOYEID) 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 ); |
--更新存在的
以下是代碼片段: UPDATE EMPLOYE AS EM SET SALARY=(SELECT SALARY FROM MANAGER WHERE MANAGERID=EM.EMPLOYEID) 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 EM.EMPLOYEID=MA.MANAGERID WHEN MATCHED THEN UPDATE SET EM.SALARY=MA.SALARY WHEN NOT MATCHED THEN INSERT VALUES (MA.MANAGERID,MA.NAME,MA.SALARY); MERGE INTO EMPLOYE AS EM USING MANAGER AS MA ON EM.EMPLOYEID=MA.MANAGERID WHEN MATCHED THEN UPDATE SET EM.SALARY=MA.SALARY WHEN NOT MATCHED THEN INSERT VALUES (MA.MANAGERID,MA.NAME,MA.SALARY);
| 在上面的處理中,我們用經(jīng)理表(MANAGER)的薪水更新了雇員表(EMPLOYE)的薪水,假設(shè)現(xiàn)在要求,如果經(jīng)理表(MANAGER)的薪水>雇員表(EMPLOYE)的薪水的時候更新,否則不更新,怎么辦呢?如下:
以下是代碼片段: MERGE INTO EMPLOYE AS EM USING MANAGER AS MA ON EM.EMPLOYEID=MA.MANAGERID WHEN MATCHED AND EM.SALARY WHEN NOT MATCHED THEN INSERT VALUES (MA.MANAGERID,MA.NAME,MA.SALARY); MERGE INTO EMPLOYE AS EM USING MANAGER AS MA ON EM.EMPLOYEID=MA.MANAGERID WHEN MATCHED AND EM.SALARY WHEN NOT MATCHED THEN INSERT VALUES (MA.MANAGERID,MA.NAME,MA.SALARY); |
不仔細的朋友可能沒有看出上面兩條語句的區(qū)別,哈哈,請仔細對比一下這兩條語句。上面的語句中多了ELSE IGNORE語句,它的意思正如它英文的意思,其它情況忽略不處理。如果你認為理論上應(yīng)該不存在EM.SALARY>MA.SALARY的數(shù)據(jù),如果有,說明有問題,你想拋個異常,怎么辦?如下:
以下是代碼片段: MERGE INTO EMPLOYE AS EM USING MANAGER AS MA ON EM.EMPLOYEID=MA.MANAGERID WHEN MATCHED AND EM.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; MERGE INTO EMPLOYE AS EM USING MANAGER AS MA ON EM.EMPLOYEID=MA.MANAGERID WHEN MATCHED AND EM.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; |
對于EM.SALARY>MA.SALARY的情況,如果你不想拋異常,而是刪除EMPLOYE中的數(shù)據(jù),怎么辦?如下:
以下是代碼片段: MERGE INTO EMPLOYE AS EM USING MANAGER AS MA ON EM.EMPLOYEID=MA.MANAGERID WHEN MATCHED AND EM.SALARY WHEN MATCHED AND EM.SALARY>MA.SALARY THEN DELETE WHEN NOT MATCHED THEN INSERT VALUES (MA.MANAGERID,MA.NAME,MA.SALARY) ELSE IGNORE; MERGE INTO EMPLOYE AS EM USING MANAGER AS MA ON EM.EMPLOYEID=MA.MANAGERID WHEN MATCHED AND EM.SALARY WHEN MATCHED AND EM.SALARY>MA.SALARY THEN DELETE WHEN NOT MATCHED THEN INSERT VALUES (MA.MANAGERID,MA.NAME,MA.SALARY) ELSE IGNORE; |
以上簡單介紹了Merge語句的使用,它的應(yīng)用不只是上面介紹的情況,其實它可以應(yīng)用在很多其他語句不好處理情況,這需要你去發(fā)現(xiàn),記住熟能生巧
|