Merge into的使用具体解释-你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是一个很强大的功能,并且是我们需求里常常会用到的一个实用的功能,所以我们一定要好好的学习到。
文中须要的測试脚本在附件里提供下载。 
 merge into sample.sql
Merge into的使用具体解释-你Merge了没有的更多相关文章
- git merge合并时遇上refusing to merge unrelated histories的解决方案
		如果git merge合并的时候出现refusing to merge unrelated histories的错误,原因是两个仓库不同而导致的,需要在后面加上--allow-unrelated-hi ... 
- pd.merge操作的on参数解释
		# 同时传入两个Key,此时会进行以['key1','key2']列表的形式进行对应,left的keys列表是:[['K0', 'K0'],['K0', 'K1'],['K1', 'K0'],['K2 ... 
- Merge into的使用详解-你Merge了没有
		Merge是一个非常有用的功能,类似于Mysql里的insert into on duplicate key. Oracle在9i引入了merge命令, 通过这个merge你能够在一个SQL语句中对一 ... 
- Merge into的使用详解-你Merge了没有【转】
		Merge是一个非常有用的功能,类似于Mysql里的insert into on duplicate key. Oracle在9i引入了merge命令, 通过这个merge你能够在一个SQL语句中对一 ... 
- SQL Server中的Merge关键字
		本文转载地址:http://www.cnblogs.com/CareySon/archive/2012/03/07/2383690.html 简介 Merge关键字是一个神奇的DML关键字.它在SQL ... 
- [git]merge和rebase的区别
		前言 我从用git就一直用rebase,但是新的公司需要用merge命令,我不是很明白,所以查了一些资料,总结了下面的内容,如果有什么不妥的地方,还望指正,我一定虚心学习. merge和rebase ... 
- SQL merge into 表合并
		Merge关键字是一个神奇的DML关键字.它在SQL Server 2008被引入,它能将Insert,Update,Delete简单的并为一句.MSDN对于Merge的解释非常的短小精悍:”根据与源 ... 
- SQL Server Merge语句的使用
		Merge关键字在SQL Server 2008被引入,它能将Insert,Update,Delete简单的并为一句.MSDN对于Merge的解释非常的短小精悍:”根据与源表联接的结果,对目标表执行插 ... 
- Hibernate三种状态的区分,以及save,update,saveOrUpdate,merge等的使用   引自http://www.blogjava.net/TiGERTiAN/archive/2008/10/25/236519.html
		Hibernate的对象有3种状态,分别为:瞬时态(Transient). 持久态(Persistent).脱管态(Detached).处于持久态的对象也称为PO(Persistence Object ... 
随机推荐
- 典当行以及海尔java小节
			1.视图问题,发现jar包都出现在根目录下面了,非常不方便.结果如下表: 原始视图是JavaEE,切换到Java视图即可: 2.Tomcat编译的时候什么都没有加载,看到的是一堆红字,那是因为tomc ... 
- UFLDL教程(六)之栈式自编码器
			第0步:初始化一些参数和常数 第1步:利用训练样本集训练第一个稀疏编码器 第2步:利用训练样本集训练第二个稀疏编码器 第3步:利用第二个稀疏编码器提取到的特征训练softmax回归模型 ... 
- JS获取TextArea和Input的同步值
			在提交表单时,如果只是表单值,用一个form即可,但有时候需要将整个表单一起提交,则可通过以下js实现. <!DOCTYPE html> <html xmlns="http ... 
- 【HDOJ】1150 Machine Schedule
			匈牙利算法. #include <stdio.h> #include <string.h> #define MAXNUM 1005 char map[MAXNUM][MAXNU ... 
- Linq打印
			Method syntax: Enumerable.Range(1, 100).ToList().ForEach(Console.WriteLine); Query syntax: (from n i ... 
- 常见的Robotium测试的问题总结:
			常见的Robotium测试的问题总结:(从别处拿来的先mark一下) 1.Robotium的 测试类ActivityInstrumentationTestCase2继承了TestCase类,即robo ... 
- Azure SQL 数据库的灵活缩放预览版简介
			Eron Kelly SQL Server 产品管理部门产品市场营销总经理 几天前,我们宣布了发布 Azure SQL 数据库的灵活缩放公共预览版.新增的灵活缩放功能通过简化开发和管理,简化了扩展和缩 ... 
- (转载)如何优化MySQL insert性能
			(转载)http://blog.csdn.net/tigernorth/article/details/8094277 对于一些数据量较大的系统,面临的问题除了是查询效率低下,还有一个很重要的问题就是 ... 
- Go语言的学习
			1.配置环境变量 2.本地阅读报的说明和文档 不用FQ window+R 出现黑窗口 执行 godoc -http :8080 在本地浏览器 localhost:8080 回车 3多行注释 ... 
- Delphi  Web Service和ISAPI的区别与联系 转
			Web Service和ISAPI的区别与联系 1.Web Service 是一种新的web应用程序分支,他们是自包含.自描述.模块化的应用,可以发布.定位.通过web调用.Web Service ... 
