Merge into的使用详解-你Merge了没有「建议收藏」

Merge into的使用详解-你Merge了没有「建议收藏」Merge是一个非常有用的功能,类似于Mysql里的insertintoonduplicatekey. Oracle在9i引入了merge命令, 通过这个merge你能够在

大家好,又见面了,我是你们的朋友全栈君。

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是一个非常强大的功能,而且是我们需求里经常会用到的一个有用的功能,所以我们一定要好好的学习到。 

文中需要的测试脚本在附件里提供下载。 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/154886.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Linux中PLSQL视频,PLSQL使用视频教程:PLSQL的使用方法「建议收藏」

    Linux中PLSQL视频,PLSQL使用视频教程:PLSQL的使用方法「建议收藏」不少小伙伴对PLSQL的应用还不是很了解,大家不必担心,在PLSQL使用视频教程中会告诉大家如何使用PLSQL。初次登录PLSQL:登录信息保存功能设置:这样第一次通过用户名/密码登录某数据库后,下次就不用再输入用户名/密码了。进入PLSQL后切换数据库连接:PLSQL中编写SQL语句并执行注意:选中要执行的语句,再执行,否则将执行所有SQL语句。执行快捷键为:F8有的老版本执行语句的按钮是这个样…

    2022年6月1日
    38
  • Keil中代码的颜色设置 ( 很 全 )[通俗易懂]

    Keil中代码的颜色设置 ( 很 全 )[通俗易懂]因为长时间要编程,对于keil上的黑字白底,如果看久了会让人眼睛产生疲倦感,所以最好将代码颜色和底色都改变一下,让自己看起来舒服一点。下面是文字图片教程(如果自己没空去设置,我后面也有两套模板可以直接用,教程也在后面)1、点击keil右上角edit——Configuration——Color&Fonts(上面标签)2、3、(注意事…

    2022年5月10日
    220
  • eclipse 导入父子工程_eclipse 导入maven 父子项目

    eclipse 导入父子工程_eclipse 导入maven 父子项目你先要确认svn上是否是maven项目,否则要自己重新建一个maven项目然后直接引入目录了。如果确认是maven项目,那么有个两个方案。案一:先用任何client软件将svn下载。然后在eclipse选择import,然后当作existmavenproject导入。案二:在project中有checkoutmavenfromscm。scm就是指版本控制软件。不过不同版本控制的sc…

    2022年5月6日
    243
  • psm倾向得分匹配法(倾向性评分匹配)

    原标题:一文读懂倾向得分匹配法(PSM)举例及stata实现(一)一、倾向匹配得分应用之培训对工资的效应政策背景:国家支持工作示范项目(NationalSupportedWork,NSW)研究目的:检验接受该项目(培训)与不接受该项目(培训)对工资的影响。基本思想:分析接受培训组(处理组,treatmentgroup)接受培训行为与不接受培训行为在工资表现上的差异。但是,现实可以观测…

    2022年4月12日
    153
  • 周星驰算巨星吗_国际巨星女明星

    周星驰算巨星吗_国际巨星女明星4月1日,国际著名的技术先锋人物、领先的反病毒厂商卡巴斯基实验室的创始人&CEO尤金•卡巴斯基与巨星成龙一起,在北京奥运会中的标志性建筑“鸟巢”,举办了“卡巴斯基诚献-‘龙的传人’成龙和他的朋友们2009北京大型演唱会”的媒体见面会。在现场,尤金•卡巴斯基与成龙共同宣布,“卡巴斯基诚献-龙的传人-成龙和他的朋友们北京演唱会”将在一个月之后,也就是五月黄金周在“鸟巢”盛大开唱。这是卡巴…

    2022年8月20日
    6
  • mysql 批量查询插入,MySQL批量插入查询出来的数据

    mysql 批量查询插入,MySQL批量插入查询出来的数据timg.jpg先看SQL:INSERTINTO`movie_detail_tab`(VIDEO_ID,PLAY_URL)SELECTb.IDASVIDEO_ID,x.playurlASPLAY_URLFROM(SELECTa.playurl,CONCAT(a.`卡通名`,a.`第几集`)AS’videoCname’FROM(SELECTplayurl,SUBSTRING_I…

    2022年10月5日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号