Merge是一个非常有用的功能,类似于Mysql里的insert into on duplicate key.

Oracle在9i引入了merge命令, 
通过这个merge你能够在一个SQL语句中对一个表同时执行inserts和updates操作. 当然是update还是insert是依据于你的指定的条件判断的,Merge into可以实现用B表来更新A表数据,如果A表中没有,则把B表的数据插入A表. MERGE命令从一个或多个数据源中选择行来updating或inserting到一个或多个表

语法如下 
MERGE INTO [your table-name] [rename your table here] 
USING ( [write your query here] )[rename your query-sql and using just like a table] 
ON ([conditional expression here] AND [...]...) 
WHEN MATHED THEN [here you can execute some update sql or something else ] 
WHEN NOT MATHED THEN [execute something else here ! ]

我们先看看一个简单的例子,来介绍一个merge into的用法 
merge into products p using newproducts np on (p.product_id = np.product_id) 
when matched then 
update set p.product_name = np.product_name 
when not matched then 
insert values(np.product_id, np.product_name, np.category)

在这个例子里。前面的merger into products using newproducts 表示的用newproducts表来merge到products表,merge的匹配关系就是on后面的条件子句的内容,这里根据两个表的product_id来进行匹配,那么匹配上了我们的操作是就是when matched then的子句里的动作了,这里的动作是update set p.product_name = np.product_name, 很显然就是把newproduct里的内容,赋值到product的product_name里。如果没有匹配上则insert这样的一条语句进去。 大家看看这个merget inot的用法是不是一目了然了呀。这里merger的功能,好比比较,然后选择更新或者是插入,是一系列的组合拳,在做merge的时候,这样同样的情况下,merge的性能是优于同等功能的update/insert语句的。有人曾经分析merge是批量处理对性能贡献很大,个人觉得这个是没有考据的。

我们也可以在using后面使用视图或者子查询。比如我们把newproducts换成 
merge into products p using (select * from newproducts) np on (p.product_id = np.product_id) 
when matched then 
update set p.product_name = np.product_name 
when not matched then 
insert values(np.product_id, np.product_name, np.category) 
也是可以的。

在Oracle 10g中MERGE有如下一些改进: 
1、UPDATE或INSERT子句是可选的 
2、UPDATE和INSERT子句可以加WHERE子句 
3、在ON条件中使用常量过滤谓词来insert所有的行到目标表中,不需要连接源表和目标表 
4、UPDATE子句后面可以跟DELETE子句来去除一些不需要的行

我们通过实例来一一看看如上的新特性

1. UPDATE或INSERT子句是可选的 
在9i里由于必须insert into和update都要存在,也就是不是update就是insert,不支持单一的操作,虽然还是可以曲线救国,呵呵 但是有些过于强势了。而10g里就是可选了,能符合我们更多的需求了 
比如上面的句子 
我们可以只存在update或者insert 
merge into products p using newproducts np on (p.product_id = np.product_id) 
when matched then 
update set p.product_name = np.product_name 
这里,如果匹配就更新,不存在就不管了。

2. UPDATE和INSERT子句可以加WHERE子句 
这也是一个功能性的改进,能够符合我们更多的需求,这个where的作用很明显是一个过滤的条件,是我们加入一些额外的条件,对只对满足where条件的进行更新和insert 
merge into products p using (select * from newproducts) np on (p.product_id = np.product_id) 
when matched then 
update set p.product_name = np.product_name where np.product_name like 'OL%' 
这里表示只是对product_name开头是'OL'的匹配上的进行update,如果开头不是'OL'的就是匹配了也不做什么事情,insert里也可以加入where 
比如 
merge into products p using (select * from newproducts) np on (p.product_id = np.product_id) 
when matched then 
update set p.product_name = np.product_name where np.product_name like 'OL%' 
when not matched then 
insert values(np.product_id, np.product_name, np.category) where np.product_name like 'OL%'

这里注意比较一下,他们返回的结果行数,是有着差异的。

3. 在ON条件中使用常量过滤谓词来insert所有的行到目标表中,不需要连接源表和目标表

merge into products p using (select * from newproducts) np on (1=0) 
when matched then 
update set p.product_name = np.product_name 
when not matched then 
insert values(np.product_id, np.product_name, np.category) 
个人觉得这个功能没有太大的意义,我们的insert into本身就支持这样的功能,没有必要使用merge

4. UPDATE子句后面可以跟DELETE子句来去除一些不需要的行 
delete只能和update配合,从而达到删除满足where条件的子句的纪录 
merge into products p using (select * from newproducts) np on (p.product_id = np.product_id) 
when matched then 
update set p.product_name = np.product_name delete where p.product_id = np.product_id where np.product_name like 'OL%' 
when not matched then 
insert values(np.product_id, np.product_name, np.category) 
这里我们达到的目的就是 会把匹配的记录的prodcut_name更新到product里,并且把product_name开头为OL的删除掉。

merge into也是一个dml语句,和其他的dml语句一样需要通过rollback和commit 结束事务。

Merge是一个非常强大的功能,而且是我们需求里经常会用到的一个有用的功能,所以我们一定要好好的学习到。

转自:http://blog.csdn.net/inthirties/article/details/4731930

转载于:https://www.cnblogs.com/xinong330/p/4721052.html

Merge into的使用详解-你Merge了没有【转】相关推荐

  1. Merge into的使用详解-你Merge了没有

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

  2. Oracle Merge Into 的用法详解实例

    Oracle merge into 的用法详解实例 作用:merge into 解决用B表跟新A表数据,如果A表中没有,则把B表的数据插入A表: 语法: MERGE INTO [your table- ...

  3. git merge 和 git rebase详解

    git merge 和 git rebase 都是用来合并两个分支的. git merge b   #把b分支合并到当前分支 git rebase b   #把b分支合并到当前分支 --------- ...

  4. 转:Merge into的使用详解

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

  5. pythontransform详解_Python自定义聚合函数merge与transform区别详解

    1.自定义聚合函数,结合agg使用 2. 同时使用多个聚合函数 3. 指定某一列使用某些聚合函数 4.merge与transform使用 import pandas as pd import nump ...

  6. c++ map用法_Pandas数据处理三板斧——map、apply、applymap详解

    在日常的数据处理中,经常会对一个DataFrame进行逐行.逐列和逐元素的操作,对应这些操作,Pandas中的map.apply和applymap可以解决绝大部分这样的数据处理需求.这篇文章就以案例附 ...

  7. [Python3]pandas.merge用法详解

    摘要 数据分析与建模的时候大部分时间在数据准备上,包括对数据的加载.清理.转换以及重塑.pandas提供了一组高级的.灵活的.高效的核心函数,能够轻松的将数据规整化.这节主要对pandas合并数据集的 ...

  8. git rebase和git merge使用方法详解

    看了网上很多讲git rebase和git merge的文章,这里做下总结,其中主要参考了这两位大佬的博客,后面附上链接 https://blog.csdn.net/weixin_42310154/a ...

  9. 详解Git合并冲突——原因及解决 “Automatic merge failed; fix conflicts and then commit the result.“

    最后更新日期:2022/10/6 在Git中使用git merge命令合并两个分支的时候,有可能产生这种情况: $ git merge A Auto-merging merge.txt CONFLIC ...

最新文章

  1. 增强现实系统的三大关键技术是什么?
  2. 这有5种来自大自然「馈赠」的AI技术及其应用,你知道多少?
  3. Centos7 nginx 虚拟主机、反向代理服务器及负载均衡,多台主机分离php-fpm实验
  4. 类会默认产生的成员函数
  5. IE下的拖拽Drag事件和示例
  6. python密码生成器的3种方法
  7. perl学习之:localtime
  8. 2020CCPC(秦皇岛) - Kingdom‘s Power(树形dp+贪心)
  9. hbase java api count_HBase内置过滤器java api的总结
  10. GPU驱动“后摩尔定律时代” 为HPC和深度学习提供强大加速动力
  11. 《深入理解 Spring Cloud 与微服务构建》第十六章 Spring Boot Security 详解
  12. Java集合系列之四大常用集合(ArrayList、LinkedList、HashSet、HashMap)的用法
  13. 3D视界迎来全息视角,VR呈现效果海报,引领未来
  14. arm11搭建Linux平台,armlinux软硬件平台搭建.doc
  15. MariaDB设置root用户密码
  16. 图片标注工具LabelImg安装与使用
  17. 《大型网站技术架构:核心原理与案例分析》.pdf——架构系列必看20本技术书籍
  18. 爱立信面试,面试官给我出的 C 算法问题
  19. 金仓数据库学习笔记(一)
  20. 实现安全登录的两种方法

热门文章

  1. TeeChart的X轴,使用伪装的时间
  2. 用Google XML Sitemaps为你的网站创建Sitemap
  3. Mysql问题 ERROR 1054 (42S22): Unknown column ‘password‘ in ‘field list‘
  4. 蓝桥杯 ADV-155 算法提高 上帝造题五分钟
  5. java trylock超时_老师,死锁设置超时这个我知道意思,但是您能举个例子么
  6. camera驱动电源配置_基于AD7656-1和ADuC7026评估电源时序控制影响
  7. 计算机文化理论基础考试单机版,计算机文化基础授课计划表
  8. Python性能测试方法
  9. net-snmp在Linux下的安装过程【转】
  10. 手把手教你用Spring Cloud和Docker构建微服务