DB2 Merge 语句的作用非常强大,它可以将一个表中的数据合并到另一个表中,在合并的同时可以进行插入、删除、更新等操作。我们还是先来看个简单的例子吧,假设你定义了一个雇员表(employe),一个经理表(manager),如下所示:

关键字、参数

into子句

在into子句中指定所要修改或者插入数据的目标表

using子句

在using子句中指定用来修改或者插入的数据源。数据源可以是表、视图或者一个子查询语句。

on子句

在on子句中指定执行插入或者修改的满足条件。

when matched | not matched

用该子句通知数据库如何对满足或不满足条件的结果做出相应的操作。可以使用以下的两类子句。

merge_update子句

merge_update子句执行对目标表中的字段值修改。当在符合on子句条件的情况下执行。如果修改子句执行,则目标表上的修改触发器将被触发。

限制:当修改一个视图时,不能指定一个default值

merge_insert 子句

merge_insert子句执行当不符合on子句条件时,往目标表中插入数据。如果插入子句执行,则目标表上插入触发器将被触发。

限制:当修改一个视图时,不能指定一个default值
 
  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);

在上面的处理中,我们用经理表(MANAGER)的薪水更新了雇员表(EMPLOYE)的薪水,假设现在要求,如果经理表(MANAGER)的薪水>雇员表(EMPLOYE)的薪水的时候更新,否则不更新,怎么办呢?如下:

  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 NOT MATCHED THEN INSERT VALUES (MA.MANAGERID,MA.NAME,MA.SALARY)
  6. ELSE IGNORE;

不仔细的朋友可能没有看出上面两条语句的区别,哈哈,请仔细对比一下这两条语句。上面的语句中多了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中的数据,怎么办?如下:

  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 DELETE
  6. WHEN NOT MATCHED THEN INSERT VALUES (MA.MANAGERID,MA.NAME,MA.SALARY)
  7. ELSE IGNORE;

update

多表联查更新多字段,需要最后增加where条件来限制更新内容。

表结构:
CREATE TABLE ATEST
 (ID    INTEGER,
  NAME  VARCHAR(256),
  CODE  INTEGER,
  NAME2 VARCHAR(256)
 )

CREATE TABLE BTEST
 (ID    INTEGER,
  CODE  INTEGER
 )

CREATE TABLE CTEST
 (ID    INTEGER,
  NAME  VARCHAR(256),
  NAME2 VARCHAR(256)
 )

SQL语句:
一张表更新另一张表的字段:
update atest
set atest.name=(select ctest.name from ctest where atest.id = ctest.id)
where atest.id in  (select ctest.id from ctest);

两张表关联更新另一张表的字段:
update atest
set (name,name2) = (SELECT CASE WHEN CTEST.NAME IS NULL THEN ATEST.NAME ELSE CTEST.NAME END, CASE WHEN CTEST.NAME2 IS NULL THEN ATEST.NAME2 ELSE CTEST.NAME2 END FROM BTEST LEFT JOIN CTEST on BTEST.ID = CTEST.ID  WHERE atest.CODE = BTEST.CODE)
WHERE atest.CODE IN (SELECT BTEST.CODE FROM BTEST);

另外一个: http://blog.csdn.net/Bobwu/archive/2009/01/13/3768636.aspx1.
declare
cursor t1 is select * from tablename;
begin
for rec in t1 loop
update tablename t set t.detail=rec.jieshao where t.objectid=rec.objid;
end loop;
end;

2.

update   student   set   (name,id   )=   
  (select   name   ,id     from   (select   student.rowid   rd,student1.name,student1.id   from   student1,student   where   student1.int_id   =student.int_id)   tmp   
  where   student.rowid=tmp.rd);   
  commit;

3.

update test_a a set (a.name,a.age)=
(select b.name,b.age from test_b b where a.id = b.id) where exists
(select * from test_b c where c.id=a.id)

4.

UPDATE   t_A   SET   Djrq=     
  (   
          SELECT   djrq   FROM   t_B   WHERE   t_A.ID   =   T_B.ID     
          WHERE   ROWNUM   =   1     
  )   
  WHERE   t_A.ID   IN     
  (   
          SELECT   ID   FROM   t_B   WHERE   jwh='XX村'   
  )

5.

update tbl1 a
   set (a.col1, a.col2) = (select b.col1, b.col2
                              from tbl2 b
                              where a.key = b.key)
   where a.key in(select key from tbl2)

db2 merge update的更多相关文章

  1. The use of function Merge (update、insert、delete)

    1.The use of function merge(update.insert.delete) Example: #1.Initialize the data create table #test ...

  2. Hibernate里save(),saveOrUpdate(),merge(),update()的区别

    save()方法用于将一个临时对象转变为持久化对象,也就是将一个新的业务实体保存到数据库中:update()方法用于将一个游离对象重新转变为持久化对象,也就是更新一个已经存在的业务实体到数据库中:sa ...

  3. Hibernate save, saveOrUpdate, persist, merge, update 区别

    Hibernate Save hibernate save()方法能够保存实体到数据库,正如方法名称save这个单词所表明的意思.我们能够在事务之外调用这个方法,这也是我不喜欢使用这个方法保存数据的原 ...

  4. Oracle并行更新的两种方式(merge/update内联视图)

    对于Oracle的两表联合更新的场景(有A.B两表,以A.id=B.id关联,根据B表中的记录更新A表中的相应字段),一般有update内联视图和merge两种方式,下面举例介绍:   创建用例表: ...

  5. 【hibernate】Hibernate中save, saveOrUpdate, persist, merge, update 区别

    Hibernate Save hibernate save()方法能够保存实体到数据库,正如方法名称save这个单词所表明的意思.我们能够在事务之外调用这个方法,这也是我不喜欢使用这个方法保存数据的原 ...

  6. Hibernate三种状态的区分,以及save,update,saveOrUpdate,merge等的使用 引自http://www.blogjava.net/TiGERTiAN/archive/2008/10/25/236519.html

    Hibernate的对象有3种状态,分别为:瞬时态(Transient). 持久态(Persistent).脱管态(Detached).处于持久态的对象也称为PO(Persistence Object ...

  7. hibernate的各种保存方式的区别 (save,persist,update,saveOrUpdte,merge,flush,lock)等

    hibernate的保存hibernate对于对象的保存提供了太多的方法,他们之间有很多不同,这里细说一下,以便区别:一.预备知识:在所有之前,说明一下,对于hibernate,它的对象有三种状态,t ...

  8. Hibernate各保存方法之间的差 (save,persist,update,saveOrUpdte,merge,flush,lock)等一下

    hibernate保存  hibernate要保存的目的是提供一个方法,多.它们之间有许多不同之处,点击此处详细说明.使得差: 一.预赛: 在所有.阐释.供hibernate,,transient.p ...

  9. Hibernate update 和 merge 、saveOrUpdate的区别

    this.getSession().update(obj); this.getSession().merge(obj); this.getSession().saveOrUpdate(obj); 1. ...

随机推荐

  1. HTML5语音输入方法

    谷歌的网站是时逛时新啊,今天在他们首页发现了HTML5的新玩法——语音搜索.可惜的是只有webkit核心的浏览器才能使用.用法很简单只需要在input添加属性 x-webkit-speech 即可,例 ...

  2. 无法创建链接服务器 "ORCL" 的 OLE DB 访问接口 "OraOLEDB.Oracle" 的实例 (错误:7302)

    原文:https://www.cnblogs.com/tiger2soft/p/6954308.html 在sqlserver中创建oracle的链接服务器时,提示此错误. 按照网上的方案,先后使用了 ...

  3. 【BZOJ4712】洪水

    题解: 注意题目说了每个点的权值只能增加 每个点的dp方程比较简单 min(v[i],sum[i]) 那么我们考虑如果v[i]增加那么上面使用sum[i]的会带来影响 暴力的做就是一个个往上查然后修改 ...

  4. Spring Security 架构与源码分析

    Spring Security 主要实现了Authentication(认证,解决who are you? ) 和 Access Control(访问控制,也就是what are you allowe ...

  5. libsecp256k1 与 openssl ecdsa

    1. 历史 区块链节点在接收到的用户发送的交易时,首先会验证交易所涉及utxo的可用性.方法是验证用户签名的合法性,涉及的签名算法就是secp256k1,一种椭圆曲线加密算法. 长期以来,实现了该算法 ...

  6. activemq 控制面板里Number Of Pending Messages、 Messages Enqueued等含义解释

    项目中在API登录接口采用了ActiveMQ消息队列中间件,采用三台MQ做集群

  7. python--装饰器2--理解

    一.装饰无参函数①.原函数target为无参函数②.装饰函数的内置函数也必须要是无参函数③.运行原理相当于:target()=decorator(target)()---->最后的()相当于执行 ...

  8. AtCoder Grand Contest 026 (AGC026) E - Synchronized Subsequence 贪心 动态规划

    原文链接https://www.cnblogs.com/zhouzhendong/p/AGC026E.html 题目传送门 - AGC026E 题意 给定一个长度为 $2n$ 的字符串,包含 $n$ ...

  9. JDK生成证书:

    JDK生成证书: 在此之前确保本地已安装JDK1.6 1.生成客户端的私钥,客户端的证书 1)keytool -genkey -alias clientkey -keystore kclient.ke ...

  10. python中@staticmethod、@classmethod和实例方法

    1.形式上的异同点: 在形式上,Python中:实例方法必须有self,类方法用@classmethod装饰必须有cls,静态方法用@staticmethod装饰不必加cls或self,如下代码所示: ...