成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

DB2 Merge語句的用法

數據庫
DB2中的Merge語句可以將一個表中的數據合并到另一個表中,在合并的同時可以進行插入、刪除、更新等操作,功能非常強大。

DB2 Merge語句是經常可以用到的DB2語句,下面對DB2 Merge語句作了詳細的介紹,如果您對此方面感興趣的話,不妨一看。

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);
---雇員表(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=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);

在上面的處理中,我們用經理表(MANAGER)的薪水更新了雇員表(EMPLOYE)的薪水,假設現在要求,如果經理表(MANAGER)的薪水>雇員表(EMPLOYE)的薪水的時候更新,否則不更新,怎么辦呢?如下:

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 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<MA.SALARY THEN UPDATE SET EM.SALARY=MA.SALARY
WHEN NOT MATCHED THEN INSERT VALUES (MA.MANAGERID,MA.NAME,MA.SALARY);

不仔細的朋友可能沒有看出上面兩條語句的區別,哈哈,請仔細對比一下這兩條語句。上面的語句中多了ELSE IGNORE語句,它的意思正如它英文的意思,其它情況忽略不處理。如果你認為理論上應該不存在EM.SALARY>MA.SALARY的數據,如果有,說明有問題,你想拋個異常,怎么辦?如下:

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;
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;

對于EM.SALARY>MA.SALARY的情況,如果你不想拋異常,而是刪除EMPLOYE中的數據,怎么辦?如下:

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 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<MA.SALARY THEN UPDATE SET EM.SALARY=MA.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語句的使用,它的應用不只是上面介紹的情況,其實它可以應用在很多其他語句不好處理情況,這需要你去發現,記住熟能生巧

 

 

 

【編輯推薦】

DB2游標原理介紹

db2日志保存的兩種方式

幾種常用的DB2循環用法

四種常用的DB2循環語句

DB2創建數據庫的實現

責任編輯:段燃 來源: 互聯網
相關推薦

2010-11-04 11:39:47

2010-08-18 08:53:23

DB2 SELECT語

2010-09-06 15:13:05

DB2

2010-11-04 15:39:40

DB2 SQL語句

2010-11-01 11:13:57

DB2表管理

2010-11-04 09:50:56

DB2循環

2010-09-30 16:46:11

DB2操作語句

2010-09-07 10:47:42

DB2數據庫

2010-11-02 15:36:18

DB2建表語句

2009-09-02 09:12:17

SELECT語句DB2

2010-11-03 11:55:23

DB2公共表表達式

2010-11-04 09:31:21

DB2循環語句

2010-11-04 12:00:59

db2存儲過程

2010-09-30 10:53:39

DB2表管理

2010-07-27 16:54:40

DB2數據庫

2010-08-04 17:01:17

DB2數據庫

2010-08-10 10:23:16

IBM DB2 V9.

2011-08-17 20:48:25

索引建立語句非聚集索引唯一索引

2010-11-04 11:32:37

DB2 CREATE

2010-08-26 11:37:38

DB2命令
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲区视频 | 亚洲欧美日韩中文字幕一区二区三区 | 日本中出视频 | 在线观看av免费 | 欧美日韩久久久 | 精品久久久久久久 | 精品亚洲一区二区三区四区五区高 | 国产亚洲一级 | 祝你幸福电影在线观看 | 国产91精品久久久久久久网曝门 | 草草网| 在线视频 亚洲 | 国产又色又爽又黄又免费 | 国产免费拔擦拔擦8x高清 | 91精品国产综合久久福利软件 | 日本成人免费网站 | 亚洲欧洲在线视频 | 中文字幕一区二区三区不卡 | 久久高清| 国产传媒在线播放 | 巨大荫蒂视频欧美另类大 | 一区二区三区四区av | 欧美国产亚洲一区二区 | 一区二区三区四区不卡视频 | 国产成人福利视频在线观看 | 中文字幕 在线观看 | 午夜欧美一区二区三区在线播放 | 国产精品国产自产拍高清 | 蜜桃av人人夜夜澡人人爽 | 欧美精品一区在线观看 | 少妇久久久 | 国产一区二区在线视频 | 在线观看亚洲一区二区 | 国产精品久久久久久久久久久免费看 | 午夜视频在线播放 | 中国三级黄色录像 | 国久久| 日韩中文字幕一区二区 | 久久亚洲视频 | 91 久久 | 中文字幕久久精品 |