merge into的形式:

  1. MERGE INTO [target-table] A USING [source-table sql] B ON([conditional expression] and [...]...)
  2.  
    WHEN MATCHED THEN
  3.  
    [UPDATE sql]
  4.  
    WHEN NOT MATCHED THEN
  5.  
    [INSERT sql]

作用:判断B表和A表是否满足ON中条件,如果满足则用B表去更新A表,如果不满足,则将B表数据插入A表但是有很多可选项,如下:
1.正常模式

2.只update或者只insert

3.带条件的update或带条件的insert

4.全插入insert实现

5.带delete的update(觉得可以用3来实现)
下面一一测试。

测试建以下表:

create table A_MERGE
(
id NUMBER not null,
name VARCHAR2(12) not null,
year NUMBER
);
create table B_MERGE
(
id NUMBER not null,
aid NUMBER not null,
name VARCHAR2(12) not null,
year NUMBER,
city VARCHAR2(12)
);
create table C_MERGE
(
id NUMBER not null,
name VARCHAR2(12) not null,
city VARCHAR2(12) not null
);
commit;

其表结构截图如下图所示:

A_MERGE表结构:

B_MERGE表结构

C_MERGE表结构

1.正常模式

先向A_MERGE和B_MERGE插入测试数据:

insert into A_MERGE values(1,'liuwei',20);

insert into A_MERGE values(2,'zhangbin',21);

insert into A_MERGE values(3,'fuguo',20);

commit;

insert into B_MERGE values(1,2,'zhangbin',30,'吉林');

insert into B_MERGE values(2,4,'yihe',33,'黑龙江');

insert into B_MERGE values(3,3,'fuguo','','山东');

commit;

此时A_MERGE和B_MERGE表中数据截图如下:

A_MERGE表数据:

B_MERGE表数据:

然后再使用merge into用B_MERGE来更新A_MERGE中的数据:

select A.ID, A.NAME,A.YEAR,B.ID,B.AID,B.NAME,B.CITY,B.YEAR from A_MERGE A,B_MERGE B WHERE A.ID= B.AID

MERGE INTO A_MERGE A USING (select B.AID,B.NAME,B.YEAR from B_MERGE B) C ON (A.id=C.AID)

WHEN MATCHED THEN

UPDATE SET A.YEAR=C.YEAR

WHEN NOT MATCHED THEN

INSERT(A.ID,A.NAME,A.YEAR) VALUES(C.AID,C.NAME,C.YEAR);

commit;

此时A_MERGE中的表数据截图如下:

2.只update模式
首先向B_MERGE中插入两个数据,来为了体现出只update没有insert,必须有一个数据是A中已经存在的

另一个数据时A中不存在的,插入数据语句如下:

  1.  
    insert into B_MERGE values(4,1,'liuwei',80,'江西');
  2.  
    insert into B_MERGE values(5,5,'tiantian',23,'河南');
  3.  
    commit;

此时A_MERGE和B_MERGE表数据截图如下:
A_MERGE表数据截图:

B_MERGE表数据截图:

然后再次用B_MERGE来更新A_MERGE,但是仅仅update,没有写insert部分。

  1.  
    merge into A_MERGE A USING (select B.AID,B.NAME,B.YEAR from B_MERGE B) C ON(A.ID=C.AID)
  2.  
    WHEN MATCHED THEN
  3.  
    UPDATE SET A.YEAR=C.YEAR;
  4.  
     
  5.  
    commit;

merge完之后A_MERGE表数据截图如下:可以发现仅仅更新了AID=1的年龄,没有插入AID=4的数据


3.只insert模式
首先改变B_MERGE中的一个数据,因为上次测试update时新增的数据没有插入到A_MERGE,这次可以用。

  1.  
    update B_MERGE set year=70 where AID=2;
  2.  
    commit;

此时A_MERGE和B_MERGE的表数据截图如下:
A_MERGE表数据:

B_MERGE表数据:

然后用B_MERGE来更新A_MERGE中的数据,此时只写了insert,没有写update:

  1.  
    merge into A_MERGE A USING (select B.AID,B.NAME,B.YEAR from B_MERGE B) C ON(A.ID=C.AID)
  2.  
    WHEN NOT MATCHED THEN
  3.  
    insert(A.ID,A.NAME,A.YEAR) VALUES(C.AID,C.NAME,C.YEAR);
  4.  
    commit;

此时A_MERGE的表数据截图如下:

4.带where条件的insert和update。
我们在on中进行完条件匹配之后,还可以在后面的insert和update中对on筛选出来的记录再做一次条件判断,用来控制哪些要更新,哪些要插入。
测试数据的sql代码如下,我们在B_MERGE修改了两个人名,并且增加了两个人员信息,但是他们来自的省份不同,
所以我们可以通过添加省份条件来控制哪些能修改,哪些能插入:

  1.  
    update B_MERGE set name='yihe++' where id=2;
  2.  
    update B_MERGE set name='liuwei++' where id=4;
  3.  
    insert into B_MERGE values(6,6,'ningqin',23,'江西');
  4.  
    insert into B_MERGE values(7,7,'bing',24,'吉安');
  5.  
    commit;

A_MGERGE表数据截图如下:

B_MERGE表数据:

然后再用B_MERGE去更新A_MERGE,但是分别在insert和update后面添加了条件限制,控制数据的更新和插入:

  1.  
    merge into A_MERGE A USING (select B.AID,B.name,B.year,B.city from B_MERGE B) C
  2.  
    ON(A.id=C.AID)
  3.  
    when matched then
  4.  
    update SET A.name=C.name where C.city != '江西'
  5.  
    when not matched then
  6.  
    insert(A.ID,A.name,A.year) values(c.AID,C.name,C.year) where C.city='江西';
  7.  
    commit;

此时A_MERGE截图如下:

5.无条件的insert。
有时我们需要将一张表中所有的数据插入到另外一张表,此时就可以添加常量过滤谓词来实现,让其只满足
匹配和不匹配,这样就只有update或者只有insert。这里我们要无条件全插入,则只需将on中条件设置为永假
即可。用B_MERGE来更新C_MERGE代码如下:

  1.  
    merge into C_MERGE C USING (select B.AID,B.NAME,B.City from B_MERGE B) C ON (1=0)
  2.  
    when not matched then
  3.  
    insert(C.ID,C.NAME,C.City) values(B.AID,B.NAME,B.City);
  4.  
    commit;

C_MERGE表在merge之前的数据截图如下:

B_MERGE数据截图如下:

C_MERGE表在merge之后数据截图如下:

6.带delete的update
   MERGE提供了在执行数据操作时清除行的选项. 你能够在WHEN MATCHED THEN UPDATE子句中包含DELETE子句. 
DELETE子句必须有一个WHERE条件来删除匹配某些条件的行.匹配DELETE WHERE条件但不匹配ON条件的行不会被从表中删除.
但我觉得这个带where条件的update差不多,都是控制update,完全可以用带where条件的update来实现。

来源:https://blog.csdn.net/jeryjeryjery/article/details/70047022

oracle中merge into用法解析的更多相关文章

  1. oracle中merge的用法,以及各版本的区别 Create

    Merge是一个非常有用的功能,类似于Mysql里的insert into on duplicate key. Oracle在9i引入了merge命令,通过这个merge你能够在一个SQL语句中对一个 ...

  2. Oracle中Merge into用法总结

    MERGE语句是Oracle9i新增的语法,用来合并UPDATE和INSERT语句.通过MERGE语句,根据一张表或子查询的连接条件对另外一张表进行查询,连接条件匹配上的进行UPDATE,无法匹配的执 ...

  3. Oracle中的rownum用法解析

    注意:rownum从1开始:  1.rownum按照记录插入时的顺序给记录排序,所以有order by的子句时一定要注意啊!  2.使用时rownum,order by字段是否为主键有什么影响?  3 ...

  4. SQL2008中Merge的用法

    在SQL2008中,新增了一个关键字:Merge,这个和Oracle的Merge的用法差不多,只是新增了一个delete方法而已.下面就是具体的使用说明: 首先是对merge的使用说明: merge ...

  5. SQL2008中Merge的用法(轉載)

    在SQL2008中,新增了一个关键字:Merge,这个和Oracle的Merge的用法差不多,只是新增了一个delete方法而已.下面就是具体的使用说明: 首先是对merge的使用说明: merge ...

  6. SQL2008中Merge的用法(转)

    在SQL2008中,新增了一个关键字:Merge,这个和Oracle的Merge的用法差不多,只是新增了一个delete方法而已.下面就是具体的使用说明: 首先是对merge的使用说明: merge ...

  7. ORACLE中DBMS_SQL的用法

    ORACLE中DBMS_SQL的用法   对于一般的select操作,如果使用动态的sql语句则需要进行以下几个步骤: open   cursor---> parse---> define ...

  8. Oracle 中 decode 函数用法

    Oracle 中 decode 函数用法 含义解释:decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 该函数的含义如下:IF 条件=值1 THEN RETURN(翻译 ...

  9. Oracle中group by用法

    Oracle中group by用法 在select 语句中可以使用group by 子句将行划分成较小的组,一旦使用分组后select操作的对象变为各个分组后的数据,使用聚组函数返回的是每一个组的汇总 ...

随机推荐

  1. IOS7 新特性

    相关ios7新特性 帖子.挺全的.一定要看看哪 http://www.devdiv.com/iOS_iPhone-ios_ui_uikit_text_kit_-thread-203631-1-1.ht ...

  2. 使用maven-shade-plugin插件解决spark依赖冲突问题

    依赖冲突:NoSuchMethodError,ClassNotFoundException   当用户应用于Spark本身依赖同一个库时可能会发生依赖冲突,导致程序奔溃.依赖冲突表现为在运行中出现No ...

  3. mybatis自己学习的一些总结

    曾经一直在使用spring的JDBCTEMPLATE和hibernate做项目.两个都还不错,spring的jdbctemplate用起来比較麻烦,尽管非常easy.而hibernate呢,用起来非常 ...

  4. PCIE xilinx v5 IP核使用前的研究

    外带一个月前啃的一个星期,加本星期心无旁骛,啃出些心得,广惠后人.但愿有用. trn信号是数据链路层的信号 TLP包是数据链路层传给transaction层的包 解包需要一个transaction的协 ...

  5. 【Unity】7.2 鼠标输入

    分类:Unity.C#.VS2015 创建日期:2016-04-21 一.简介 在桌面系统的游戏中,鼠标输入是最基本的输入方式之一.游戏很多操作都需要鼠标来完成,例如武器的瞄准和开火.菜单的单击.物体 ...

  6. 错误状态码URL重定向

    server { listen 80; server_name www.espressos.com; location / { root /data0/www/bbs; index index.htm ...

  7. 李洪强iOS开发之静态库的打包一

    李洪强iOS开发之静态库的打包一 //静态库一般做一下几种事情 //1 工具类 算法逻辑 新建工具类LHQTools 定义类方法 + (NSInteger)sumWithNum1: (NSIntege ...

  8. django模型创建

    定义模型 模型,属性,表,字段之间的关系 一个模型类在数据库中对应一张表,在模型类中定义的属性,对应该模型对照表中的一个字段 定义属性:见下文 创建模型类 元选项 在模型类中定义Meta类,用于设置元 ...

  9. My To Do List (Task Manager)

    My To Do List (Task Manager) With everything that business owners deal with throughout their day, th ...

  10. 3. CNN卷积网络-反向更新

    1. CNN卷积网络-初识 2. CNN卷积网络-前向传播算法 3. CNN卷积网络-反向更新 1. 前言 如果读者详细的了解了DNN神经网络的反向更新,那对我们今天的学习会有很大的帮助.我们的CNN ...