DB2的MERGE使用

MERGE语句是将有条件更新、插入或者删除操作组合起来

语法如下:
 MERGE INTO <target> USING <source> 
  ON <match-condition>
 WHEN [NOT] MATCHED [AND <othe-condition>]
 THEN [UPDATE SET ... | DELETE | INSERT VALUES ... | SIGNAL ...]
 [ELSE IGNORE]
 
target:表示操作的对象,表,视图(最终还是操作表)
 source:一个查询,或者一个表
 match-condition:target和source的链接条件
 when matched:表示符合链接条件
 when not matched:表示不符合链接条件
 other-condition:其他判断条件
 signal:用于标注错误处理,如添加一条已经存在的数据的时候,就可以这么写:
        signal sqlstate='70001'
            set message_text='Record already exists'
 else ignore:当不满足前面任何when条件的数据,进行忽略处理。

WHEN MATCHED THEN :MATCHED的情况下,只有UPDATE和DELETE语句可以使用,不能使用INSERT语句。  

WHEN NOTE MATCHED THEN :NOTE MATCHED的情况下,不能使用UPDATE和DELETE语句,只可以使用INSERT语句。  (有数据就更新或删除,无数据就插入)

WHEN [NOT] MATCHED AND ( ... AND ... OR ... ) THEN :
除了使用默认的MATCHED/NOT MATCHED以外,还可以指定额外的判断条件,但与MATCHED并列的条件只能用AND,而AND里面可以使用AND和OR

例:

  1. ---雇员表(EMPLOYE)  
  2. CREATE TABLE EMPLOYE (  
  3. EMPLOYEID INTEGER  NOT NULL,---员工号  
  4. NAME VARCHAR(20) NOT NULL,---姓名  
  5. SALARY DOUBLE---薪水  
  6. );  
  7. INSERT INTO EMPLOYE (EMPLOYEID,NAME,SALARY) VALUES   
  8. (1,'张三',1000),  
  9. (2,'李四',2000),  
  10. (3,'王五',3000),  
  11. (4,'赵六',4000),  
  12. (5,'高七',5000);  
  13. --经理表(MANAGER)  
  14. CREATE TABLE MANAGER (  
  15. EMPLOYEID INTEGER  NOT NULL,---经理号  
  16. NAME VARCHAR(20) NOT NULL,---姓名  
  17. SALARY DOUBLE---薪水  
  18. );  
  19. INSERT INTO MANAGER (MANAGERID,NAME,SALARY) VALUES   
  20. (3,'王五',5000),  
  21. (4,'赵六',6000); 

经过一段时间,你发现这样的数据模型,或者说表结构设计简直就是一大败笔,经理和雇员都是员工嘛,为什么要设计两个表呢?发现错误后就需要改正,所以你决定,删除经理表(MANAGER)表,将MANAGER 表中的数据合并到EMPLOYE 表中,仔细分析发现,王五在两个表中都存在(可能是干的好升官了),而刘八在EMPLOYE 表中并不存在,现在,我们要求把EMPLOYE 表中不存在的MANAGER都插入到EMPLOYE 表中,存在的更新薪水。该怎么办呢?这个问题并不难,通常,我们可以分两步,如下所示:

  1. --更新存在的  
  2. UPDATE EMPLOYE AS EM SET SALARY=(SELECT SALARY FROM MANAGER WHERE MANAGERID=EM.EMPLOYEID)  
  3. WHERE EMPLOYEID IN (  
  4. SELECT MANAGERID FROM MANAGER  
  5. );  
  6. ---插入不存在的  
  7. INSERT INTO EMPLOYE (EMPLOYEID,NAME,SALARY)  
  8. SELECT MANAGERID,NAME,SALARY FROM MANAGER WHERE MANAGERID NOT IN (  
  9. SELECT EMPLOYEID FROM EMPLOYE  
  10. ); 

上面的处理是可以的,但是我们还可以有更简单的方法,就是用Merge语句,如下所示:


  1. MERGE INTO EMPLOYE AS EM  
  2. USING MANAGER AS MA  
  3. ON EM.EMPLOYEID=MA.MANAGERID  
  4. WHEN MATCHED THEN UPDATE SET EM.SALARY=MA.SALARY  
  5. WHEN NOT MATCHED THEN INSERT VALUES (MA.MANAGERID,MA.NAME,MA.SALARY); 
不仔细的朋友可能没有看出上面两条语句的区别,哈哈,请仔细对比一下这两条语句。上面的语句中多了ELSE IGNORE语句,它的意思正如它英文的意思,其它情况忽略不处理。如果你认为理论上应该不存在EM.SALARY>MA.SALARY的数据,如果有,说明有问题,你想抛个异常,怎么办?如下:

  1. MERGE INTO EMPLOYE AS EM  
  2. USING MANAGER AS MA  
  3. ON EM.EMPLOYEID=MA.MANAGERID  
  4. WHEN MATCHED AND EM.SALARY<MA.SALARY THEN UPDATE SET EM.SALARY=MA.SALARY  
  5. WHEN MATCHED AND EM.SALARY>MA.SALARY THEN SIGNAL SQLSTATE '70001' SET MESSAGE_TEXT = 'EM.SALARY>MA.SALARY'  
  6. WHEN NOT MATCHED THEN INSERT VALUES (MA.MANAGERID,MA.NAME,MA.SALARY)  
  7. 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;

    声明:转载http://blog.csdn.net/shangboerds/article/details/4775422仅供学习、研究、欣赏



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值