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. jquery .On()绑定事件的触发机制

    选择器只能选择已存在元素,其他元素需要作为参数传递给on

  2. bzoj2870

    题解: 边分治入门题 当然并查集+维护直径更加简单 就是两棵树二合一直径是两颗树上的4个直径两两组合的最大值 查询路径长度你搞个差分查个lca就好了 点分治并不能做这题 分成多个联通块就gg了(点分治 ...

  3. 【BZOJ3697】采药人的路径

    题解: 比较简单的点分治 首先暴力的话直接枚举 然后枚举另一个点的时候顺便看一下有没有零点 n^2 考虑点分治 分治之后用f[i][0/1]表示权值为i,有没有零点的方案数 我们来证明一件事情,如果两 ...

  4. 请推荐几个asp.net下做网站的好的开源框架

    1.We7 CMS We7 CMS是由西部动力开发的一款充分发掘互联网Web2.0(如博客.RSS等)的信息组织优势,将其理念利用到政府企事业网站的构建.组织.管理中的网站建设和管理方面的产品. 系统 ...

  5. 【Android】application标签说明

    <application> <application android:allowClearUserData=["true" | "false" ...

  6. BZOJ4566 [Haoi2016]找相同字符 字符串 SAM

    原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ4566.html 题目传送门 - BZOJ4566 题意 给定两个字符串 $s1$ 和 $s2$ ,问有 ...

  7. 【JavaScript】对象

    No1: typeof操作符获取对象的类型 null的类型是object,Array的类型也是object,如果我们用typeof将无法区分出null.Array和通常意义上的object——{}. ...

  8. datatables跳转自定义页面(后端分页)

    在后端分页的情况下,怎么做到跳转自定义页面? 0x01 难点: 一. 怎么添加自定义代码? 前提:datatables在整个html加载完毕后,进行datatables数据的渲染,并且把右下角的 “上 ...

  9. vue笔记-模板,计算属性,class与style,data属性

    数据和方法 1:只有当实例被创建时 data 中存在的属性才是响应式的,也可以预定义一些空的属性,唯一的意外就是Object.freeze(obj),这会阻止修改现有的属性;也就是说一个数据在放到根实 ...

  10. 004.Heartbeat+HAProxy+MySQL半复制高可用架构

    一 基础环境 节点 系统版本 MySQL版本 业务IP 心跳IP Master CentOS 7.5 MySQL 5.6 192.168.88.100 192.168.77.100 Slave Cen ...