1. Merge是一个非常有用的功能,类似于Mysql里的insert into on duplicate key.
  2.  
  3. Oracle9i引入了merge命令,
  4. 通过这个merge你能够在一个SQL语句中对一个表同时执行insertsupdates操作. 当然是update还是insert是依据于你的指定的条件判断的,Merge into可以实现用B表来更新A表数据,如果A表中没有,则把B表的数据插入A表. MERGE命令从一个或多个数据源中选择行来updatinginserting到一个或多个表
  5.  
  6. 语法如下
  7. MERGE INTO [your table-name] [rename your table here]
  8. USING ( [write your query here] )[rename your query-sql and using just like a table]
  9. ON ([conditional expression here] AND [...]...)
  10. WHEN MATHED THEN [here you can execute some update sql or something else ]
  11. WHEN NOT MATHED THEN [execute something else here ! ]
  12.  
  13. 我们先看看一个简单的例子,来介绍一个merge into的用法
  14. merge into products p using newproducts np on (p.product_id = np.product_id)
  15. when matched then
  16. update set p.product_name = np.product_name
  17. when not matched then
  18. insert values(np.product_id, np.product_name, np.category)
  19.  
  20. 在这个例子里。前面的merger into products using newproducts 表示的用newproducts表来mergeproducts表,merge的匹配关系就是on后面的条件子句的内容,这里根据两个表的product_id来进行匹配,那么匹配上了我们的操作是就是when matched then的子句里的动作了,这里的动作是update set p.product_name = np.product_name, 很显然就是把newproduct里的内容,赋值到productproduct_name里。如果没有匹配上则insert这样的一条语句进去。 大家看看这个merget inot的用法是不是一目了然了呀。这里merger的功能,好比比较,然后选择更新或者是插入,是一系列的组合拳,在做merge的时候,这样同样的情况下,merge的性能是优于同等功能的update/insert语句的。有人曾经分析merge是批量处理对性能贡献很大,个人觉得这个是没有考据的。
  21.  
  22. 我们也可以在using后面使用视图或者子查询。比如我们把newproducts换成
  23. merge into products p using (select * from newproducts) np on (p.product_id = np.product_id)
  24. when matched then
  25. update set p.product_name = np.product_name
  26. when not matched then
  27. insert values(np.product_id, np.product_name, np.category)
  28. 也是可以的。
  29.  
  30. Oracle 10gMERGE有如下一些改进:
  31. UPDATEINSERT子句是可选的
  32. UPDATEINSERT子句可以加WHERE子句
  33. 、在ON条件中使用常量过滤谓词来insert所有的行到目标表中,不需要连接源表和目标表
  34. UPDATE子句后面可以跟DELETE子句来去除一些不需要的行
  35.  
  36. 我们通过实例来一一看看如上的新特性
  37.  
  38. . UPDATEINSERT子句是可选的
  39. 9i里由于必须insert intoupdate都要存在,也就是不是update就是insert,不支持单一的操作,虽然还是可以曲线救国,呵呵 但是有些过于强势了。而10g里就是可选了,能符合我们更多的需求了
  40. 比如上面的句子
  41. 我们可以只存在update或者insert
  42. merge into products p using newproducts np on (p.product_id = np.product_id)
  43. when matched then
  44. update set p.product_name = np.product_name
  45. 这里,如果匹配就更新,不存在就不管了。
  46.  
  47. . UPDATEINSERT子句可以加WHERE子句
  48. 这也是一个功能性的改进,能够符合我们更多的需求,这个where的作用很明显是一个过滤的条件,是我们加入一些额外的条件,对只对满足where条件的进行更新和insert
  49. merge into products p using (select * from newproducts) np on (p.product_id = np.product_id)
  50. when matched then
  51. update set p.product_name = np.product_name where np.product_name like 'OL%'
  52. 这里表示只是对product_name开头是'OL'的匹配上的进行update,如果开头不是'OL'的就是匹配了也不做什么事情,insert里也可以加入where
  53. 比如
  54. merge into products p using (select * from newproducts) np on (p.product_id = np.product_id)
  55. when matched then
  56. update set p.product_name = np.product_name where np.product_name like 'OL%'
  57. when not matched then
  58. insert values(np.product_id, np.product_name, np.category) where np.product_name like 'OL%'
  59.  
  60. 这里注意比较一下,他们返回的结果行数,是有着差异的。
  61.  
  62. . ON条件中使用常量过滤谓词来insert所有的行到目标表中,不需要连接源表和目标表
  63.  
  64. merge into products p using (select * from newproducts) np on (=)
  65. when matched then
  66. update set p.product_name = np.product_name
  67. when not matched then
  68. insert values(np.product_id, np.product_name, np.category)
  69. 个人觉得这个功能没有太大的意义,我们的insert into本身就支持这样的功能,没有必要使用merge
  70.  
  71. . UPDATE子句后面可以跟DELETE子句来去除一些不需要的行
  72. delete只能和update配合,从而达到删除满足where条件的子句的纪录
  73. merge into products p using (select * from newproducts) np on (p.product_id = np.product_id)
  74. when matched then
  75. update set p.product_name = np.product_name delete where p.product_id = np.product_id where np.product_name like 'OL%'
  76. when not matched then
  77. insert values(np.product_id, np.product_name, np.category)
  78. 这里我们达到的目的就是 会把匹配的记录的prodcut_name更新到product里,并且把product_name开头为OL的删除掉。
  79.  
  80. merge into也是一个dml语句,和其他的dml语句一样需要通过rollbackcommit 结束事务。
  81.  
  82. Merge是一个非常强大的功能,而且是我们需求里经常会用到的一个有用的功能,所以我们一定要好好的学习到。

C# Merge into的使用详解的更多相关文章

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

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

  2. Merge into的使用详解-你Merge了没有【转】

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

  3. Oracle Merge Into的用法详解

    1.    MERGE INTO 的用途         MERGE INTO 是Oracle 9i以后才出现的新的功能.那这个功能 是什么呢?         简单来说,就是:“有则更新,无则插入” ...

  4. 多表连接的三种方式详解 hash join、merge join、 nested loop

    在多表联合查询的时候,如果我们查看它的执行计划,就会发现里面有多表之间的连接方式.多表之间的连接有三种方式:Nested Loops,Hash Join 和 Sort Merge Join.具体适用哪 ...

  5. svn merge详解

    svn merge详解 [OK] http://blog.163.com/lgh_2002/blog/static/4401752620106202710487/ Subversion的分支通常用于在 ...

  6. Git初探--笔记整理和Git命令详解

    几个重要的概念 首先先明确几个概念: WorkPlace : 工作区 Index: 暂存区 Repository: 本地仓库/版本库 Remote: 远程仓库 当在Remote(如Github)上面c ...

  7. (一)SQL Server分区详解Partition(目录)

    一.SQL Server分区介绍 在SQL Server中,数据库的所有表和索引都视为已分区表和索引,默认这些表和索引值包含一个分区:也就是说表或索引至少包含一个分区.SQL Server中数据是按水 ...

  8. Git 常用命令详解

    Git 是一个很强大的分布式版本管理工具,它不但适用于管理大型开源软件的源代码(如:linux kernel),管理私人的文档和源代码也有很多优势(如:wsi-lgame-pro) Git 的更多介绍 ...

  9. Oracle执行计划详解

    Oracle执行计划详解 --- 作者:TTT BLOG 本文地址:http://blog.chinaunix.net/u3/107265/showart_2192657.html --- 简介:   ...

随机推荐

  1. POJ.1797 Heavy Transportation (Dijkstra变形)

    POJ.1797 Heavy Transportation (Dijkstra变形) 题意分析 给出n个点,m条边的城市网络,其中 x y d 代表由x到y(或由y到x)的公路所能承受的最大重量为d, ...

  2. UVA.699 The Falling Leaves (二叉树 思维题)

    UVA.699 The Falling Leaves (二叉树 思维题) 题意分析 理解题意花了好半天,其实就是求建完树后再一条竖线上的所有节点的权值之和,如果按照普通的建树然后在计算的方法,是不方便 ...

  3. 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 ...

  4. [转载]系统管理:update-alternatives

    http://blog.csdn.net/dbigbear/article/details/4398961 好吧,其实博主也是转载的. update-alternatives --display | ...

  5. JavaScript的性能优化:加载和执行

    随着 Web2.0 技术的不断推广,越来越多的应用使用 javascript 技术在客户端进行处理,从而使 JavaScript 在浏览器中的性能成为开发者所面临的最重要的可用性问题.而这个问题又因 ...

  6. 数据结构&字符串:字典树

    前缀树里面可以存一堆字符串,也可以说是一堆单词,存完之后我们可以轻松判断一个指定的字符串是否出现过 下面我来详细解释一下实现细节 *+; //单词个数*每一个单词的字符数 ; struct Trie ...

  7. Mantis 从Windows 迁移到Linux上

    1. 导出windows manits的mysql数据库文件, 在cmd运行:mysqldump -uroot -p3edc$RFV bugtracker > C:/mantis.sql; 2. ...

  8. 【BZOJ】2200: [Usaco2011 Jan]道路和航线

    [题意]给定n个点的图,正权无向边,正负权有向边,保证对有向边(u,v),v无法到达u,求起点出发到达所有点的最短距离. [算法]拓扑排序+dijkstra [题解]因为有负权边,直接对原图进行spf ...

  9. Vue 使用中的小技巧(山东数漫江湖)

    在vue的使用过程中会遇到各种场景,当普通使用时觉得没什么,但是或许优化一下可以更高效更优美的进行开发.下面有一些我在日常开发的时候用到的小技巧,在下将不定期更新~ 1. 多图表resize事件去中心 ...

  10. 【洛谷 P1073】 最优贸易 (Tarjan缩点+拓扑排序)

    题目链接 先\(Tarjan\)缩点,记录每个环内的最大值和最小值. 然后跑拓扑排序,\(Min[u]\)表示到\(u\)的最小值,\(ans[u]\)表示到\(u\)的答案,\(Min\)和\(an ...