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来实现)
下面一一测试。

测试建以下表:

  1. create table A_MERGE
  2. (
  3. id NUMBER not null,
  4. name VARCHAR2(12) not null,
  5. year NUMBER
  6. );
  7. create table B_MERGE
  8. (
  9. id NUMBER not null,
  10. aid NUMBER not null,
  11. name VARCHAR2(12) not null,
  12. year NUMBER,
  13. city VARCHAR2(12)
  14. );
  15. create table C_MERGE
  16. (
  17. id NUMBER not null,
  18. name VARCHAR2(12) not null,
  19. city VARCHAR2(12) not null
  20. );
  21. commit;

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

A_MERGE表结构:

B_MERGE表结构

C_MERGE表结构

1.正常模式

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

  1. insert into A_MERGE values(1,'liuwei',20);
  2. insert into A_MERGE values(2,'zhangbin',21);
  3. insert into A_MERGE values(3,'fuguo',20);
  4. commit;
  5. insert into B_MERGE values(1,2,'zhangbin',30,'吉林');
  6. insert into B_MERGE values(2,4,'yihe',33,'黑龙江');
  7. insert into B_MERGE values(3,3,'fuguo',,'山东');
  8. commit;

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

A_MERGE表数据:

B_MERGE表数据:

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

  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. WHEN NOT MATCHED THEN
  5. INSERT(A.ID,A.NAME,A.YEAR) VALUES(C.AID,C.NAME,C.YEAR);
  6. 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. 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 using 的用法解析相关推荐

  1. oracle分组聚合查询,Oracle中分组查询group by用法规则解析

    本篇文章小编给大家分享一下Oracle中分组查询group by用法规则解析,文章介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. Oracle中group by ...

  2. day12_oracle hint——SQL优化过程中常见Oracle中HINT的30个用法

    在SQL语句优化过程中,经常会用到hint, 以下是在SQL优化过程中常见Oracle中"HINT"的30个用法 1. /*+ALL_ROWS*/ 表明对语句块选择基于开销的优化方 ...

  3. Oracle中merge into的使用

    http://blog.csdn.net/yuzhic/article/details/1896878 http://blog.csdn.net/macle2010/article/details/5 ...

  4. Oracle中INSTR和SUBSTR的用法

    2019独角兽企业重金招聘Python工程师标准>>> Oracle中INSTR和SUBSTR的用法 Oracle中INSTR的用法: INSTR方法的格式为 INSTR(源字符串, ...

  5. oracle8i substr,Oracle中INSTR和SUBSTR的用法

    Oracle中INSTR和SUBSTR的用法 Oracle中INSTR的用法: INSTR方法的格式为 INSTR(源字符串, 要查找的字符串, 从第几个字符开始, 要找到第几个匹配的序号) 返回找到 ...

  6. Oracle中rownum的说明及用法总结

    Oracle中rownum的说明及用法总结 一.rownum的说明 rownum是Oracle特有的一个关键字. (1)对于基表,在insert记录时,oracle就按照insert的顺序,将rown ...

  7. oracle中merge的用法,以及各版本的区别 Create checkbox全选JS(转载)

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

  8. sql中group by 和having 用法解析

    --sql中的group by 用法解析: -- Group By语句从英文的字面意义上理解就是"根据(by)一定的规则进行分组(Group)". --它的作用是通过一定的规则将一 ...

  9. Oracle中connet by和level用法

    这几天看sql看到了有关connect by和level的关键字用法,以前都用mysql也没用过这个关键字,感觉挺有用的,就学了下,整理一下学习过程. 首先,connect by和level都是为了快 ...

最新文章

  1. spark算子_Spark常用算子
  2. ba+ii+plus模拟+android,财务计算器(BAII PLUS)
  3. VTK:图片之ImageMapper
  4. 记一次神奇的SQL查询经历,group by慢查询优化
  5. 解决浏览器无法登陆pki问题,删除浏览器缓存
  6. Linux之whereis命令
  7. JavaWeb笔记(一)Java网络编程
  8. MySQL 性能优化一
  9. php实现倒计时,PHP实现倒计时功能
  10. AP下发AT+CLAC命令后,手机出现宕机 - MTK物联网在线解答 - 技术论坛
  11. 重邮计算机学院艺术团,毕业季 | 重庆邮电大学2019届 “邮梦青春,毕业季”文艺晚会...
  12. Instagram移动网页版推图片分享功能:追求国际增长
  13. excel常用函数及功能操作
  14. 调用Google翻译 语音接口
  15. 循环链表之双循环链表
  16. 电子稳定程序系统--ESP
  17. 第六章、FOR、IF和while
  18. ios中导入第三方类库
  19. 7-2 学生、大学生、研究生类-2 (20 分)
  20. 调制、数字调制、模拟调制比较

热门文章

  1. 自动化测试python selenium案例_Python selenium自动化测试框架实战--登录测试案例
  2. c语言存储汉字的变量类型,C语言之变量存储类型与链接属性
  3. linux下 mount IMG文件提示“您必须指定文件系统类型”
  4. 计算机断电无法启动不了系统,电脑断电之后无法开机怎么回事_电脑断电开不开机的处理办法...
  5. c语言getline函数什么意思,getline函数(精华版)详解
  6. Request对象接收Form表单提交
  7. sql 执行顺序-子查询
  8. 23款奔驰GLS400升级柏林之声音响系统+HUD抬头显示系统
  9. arma3linux服务端怎么下mod,武装突袭3 挂载MOD方法 详细教程
  10. 服务器任务栏换个位置,Win7系统任务栏设置技巧 轻松玩转不求人