C# Merge into的使用详解
- 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有如下一些改进:
- 、UPDATE或INSERT子句是可选的
- 、UPDATE和INSERT子句可以加WHERE子句
- 、在ON条件中使用常量过滤谓词来insert所有的行到目标表中,不需要连接源表和目标表
- 、UPDATE子句后面可以跟DELETE子句来去除一些不需要的行
- 我们通过实例来一一看看如上的新特性
- . 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
- 这里,如果匹配就更新,不存在就不管了。
- . 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%'
- 这里注意比较一下,他们返回的结果行数,是有着差异的。
- . 在ON条件中使用常量过滤谓词来insert所有的行到目标表中,不需要连接源表和目标表
- merge into products p using (select * from newproducts) np on (=)
- 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
- . 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是一个非常强大的功能,而且是我们需求里经常会用到的一个有用的功能,所以我们一定要好好的学习到。
C# Merge into的使用详解的更多相关文章
- 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语句中对一 ...
- Oracle Merge Into的用法详解
1. MERGE INTO 的用途 MERGE INTO 是Oracle 9i以后才出现的新的功能.那这个功能 是什么呢? 简单来说,就是:“有则更新,无则插入” ...
- 多表连接的三种方式详解 hash join、merge join、 nested loop
在多表联合查询的时候,如果我们查看它的执行计划,就会发现里面有多表之间的连接方式.多表之间的连接有三种方式:Nested Loops,Hash Join 和 Sort Merge Join.具体适用哪 ...
- svn merge详解
svn merge详解 [OK] http://blog.163.com/lgh_2002/blog/static/4401752620106202710487/ Subversion的分支通常用于在 ...
- Git初探--笔记整理和Git命令详解
几个重要的概念 首先先明确几个概念: WorkPlace : 工作区 Index: 暂存区 Repository: 本地仓库/版本库 Remote: 远程仓库 当在Remote(如Github)上面c ...
- (一)SQL Server分区详解Partition(目录)
一.SQL Server分区介绍 在SQL Server中,数据库的所有表和索引都视为已分区表和索引,默认这些表和索引值包含一个分区:也就是说表或索引至少包含一个分区.SQL Server中数据是按水 ...
- Git 常用命令详解
Git 是一个很强大的分布式版本管理工具,它不但适用于管理大型开源软件的源代码(如:linux kernel),管理私人的文档和源代码也有很多优势(如:wsi-lgame-pro) Git 的更多介绍 ...
- Oracle执行计划详解
Oracle执行计划详解 --- 作者:TTT BLOG 本文地址:http://blog.chinaunix.net/u3/107265/showart_2192657.html --- 简介: ...
随机推荐
- POJ.1797 Heavy Transportation (Dijkstra变形)
POJ.1797 Heavy Transportation (Dijkstra变形) 题意分析 给出n个点,m条边的城市网络,其中 x y d 代表由x到y(或由y到x)的公路所能承受的最大重量为d, ...
- UVA.699 The Falling Leaves (二叉树 思维题)
UVA.699 The Falling Leaves (二叉树 思维题) 题意分析 理解题意花了好半天,其实就是求建完树后再一条竖线上的所有节点的权值之和,如果按照普通的建树然后在计算的方法,是不方便 ...
- win7下idea远程连接hadoop,运行wordCount
1.将hadoop-2.6.1.tar.gz解压到本地 配置环境变量 HADOOP_HOME E:\kaifa\hadoop-2.6.1\hadoop-2.6.1 HADOOP_BIN_PATH %H ...
- [转载]系统管理:update-alternatives
http://blog.csdn.net/dbigbear/article/details/4398961 好吧,其实博主也是转载的. update-alternatives --display | ...
- JavaScript的性能优化:加载和执行
随着 Web2.0 技术的不断推广,越来越多的应用使用 javascript 技术在客户端进行处理,从而使 JavaScript 在浏览器中的性能成为开发者所面临的最重要的可用性问题.而这个问题又因 ...
- 数据结构&字符串:字典树
前缀树里面可以存一堆字符串,也可以说是一堆单词,存完之后我们可以轻松判断一个指定的字符串是否出现过 下面我来详细解释一下实现细节 *+; //单词个数*每一个单词的字符数 ; struct Trie ...
- Mantis 从Windows 迁移到Linux上
1. 导出windows manits的mysql数据库文件, 在cmd运行:mysqldump -uroot -p3edc$RFV bugtracker > C:/mantis.sql; 2. ...
- 【BZOJ】2200: [Usaco2011 Jan]道路和航线
[题意]给定n个点的图,正权无向边,正负权有向边,保证对有向边(u,v),v无法到达u,求起点出发到达所有点的最短距离. [算法]拓扑排序+dijkstra [题解]因为有负权边,直接对原图进行spf ...
- Vue 使用中的小技巧(山东数漫江湖)
在vue的使用过程中会遇到各种场景,当普通使用时觉得没什么,但是或许优化一下可以更高效更优美的进行开发.下面有一些我在日常开发的时候用到的小技巧,在下将不定期更新~ 1. 多图表resize事件去中心 ...
- 【洛谷 P1073】 最优贸易 (Tarjan缩点+拓扑排序)
题目链接 先\(Tarjan\)缩点,记录每个环内的最大值和最小值. 然后跑拓扑排序,\(Min[u]\)表示到\(u\)的最小值,\(ans[u]\)表示到\(u\)的答案,\(Min\)和\(an ...