MERGE语句是Oracle9i新增的语法,用来合并UPDATE和INSERT语句。
通过MERGE语句,根据一张表或子查询的连接条件对另外一张表进行查询,
连接条件匹配上的进行UPDATE,无法匹配的执行INSERT。
这个语法仅需要一次全表扫描就完成了全部工作,执行效率要高于INSERT+UPDATE。

语法:

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 ! ]

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

这里说一下我自己的理解:
第一点意思是可以在MERGE INTO语法中只写WHEN MATCHED THEN或者只写WHEN NOT MATCHED THEN。这里不再赘述。
第二点意思是我们可以在THEN后的UPDATE或者INSERT语句后面加上WHERE条件,比如有这样的需求:当A表中的ID在B表中不存在时进行插入。当存在时,A表的NAME不为空时进行更新。这种情况就需要在UPDATE字句后+WHERE条件。
第三点意思是我们可以在ON条件中不进行目标表和USING表的关联,可以在ON条件中写如1=1这样的条件。比如我们有这样的需求:当isAllAdd参数为false时,进行正常的MERGE INTO。当isAllAdd参数为true时,全部执行插入。我们就可以使用这个新特性,对ON中的条件进行筛选从而达到一条sql即可满足业务的目的。
第四点意思是我们不止可以在MERGE INTO中进行插入更新,还可以对匹配的数据进行删除操作。这个点非常重要,个人认为第四点是这次改进中最需要我们学习的一点。比如我们有这样的需求:A表中有期中学生ID,考试年份、考试成绩、期末考试成绩四个字段。我们给期末考试成绩做批量删除功能,当没有期中考试成绩时,删除该数据。当有期中考试成绩时,将期末考试成绩置空。传统写法将需要删除的人员的List中的信息其数据库进行查询,看其中的每一条是执行修改还是删除,在分别调用。我们现在只需要
MERGE INTO A
USING (TABLE EMPLOYEE) B
ON (A.EMPLOYEEID = B.EMPLOYEEID AND A.YEAR = B.YEAR)
WHEN MATCHED THEN
UPDATE SET 期中考试成绩 = ""
DELETE WHERE 期末考试成绩 IS NULL

特别说明:
DELETE字句只能写在MATCHED情况中,不匹配时无法删除会报错。
当DELETE跟在UPDATE字句之后时,DELETE字句是针对UPDATE字句修改后的数据进行过滤的。比如需要删除所有C字段="1"的数据,UPDATE字句将所有数据的C字段都更新为1,那么会删除所有数据,而不是原本为1的数据。

Oracle中Merge into用法总结的更多相关文章

  1. oracle中merge的用法,以及各版本的区别 Create

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

  2. oracle中merge into用法解析

    merge into的形式: MERGE INTO [target-table] A USING [source-table sql] B ON([conditional expression] an ...

  3. SQL2008中Merge的用法

    在SQL2008中,新增了一个关键字:Merge,这个和Oracle的Merge的用法差不多,只是新增了一个delete方法而已.下面就是具体的使用说明: 首先是对merge的使用说明: merge ...

  4. SQL2008中Merge的用法(轉載)

    在SQL2008中,新增了一个关键字:Merge,这个和Oracle的Merge的用法差不多,只是新增了一个delete方法而已.下面就是具体的使用说明: 首先是对merge的使用说明: merge ...

  5. SQL2008中Merge的用法(转)

    在SQL2008中,新增了一个关键字:Merge,这个和Oracle的Merge的用法差不多,只是新增了一个delete方法而已.下面就是具体的使用说明: 首先是对merge的使用说明: merge ...

  6. Oracle 中 decode 函数用法

    Oracle 中 decode 函数用法 含义解释:decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 该函数的含义如下:IF 条件=值1 THEN RETURN(翻译 ...

  7. Oracle中group by用法

    Oracle中group by用法 在select 语句中可以使用group by 子句将行划分成较小的组,一旦使用分组后select操作的对象变为各个分组后的数据,使用聚组函数返回的是每一个组的汇总 ...

  8. Oracle中merge into的使用

    http://blog.csdn.net/yuzhic/article/details/1896878 http://blog.csdn.net/macle2010/article/details/5 ...

  9. SQL中Merge的用法

    SQL中Merge的用法 Merge的用法 Merge可以完成以下功能: 1.  两个表之间数据的更新 2.  进行进销存更新库存 3.  进行表之间数据的复制 语法说明: 1.  在语句结束后一定要 ...

随机推荐

  1. AutoMagic

    AutoMagic 是一个基于WebUI的自动化管理平台.为什么叫AutoMagic呢?因为自动化(Automation)在执行起来的时候是一个很神奇的事情,它可以无人值守的模拟人的操作,就像魔术(M ...

  2. sprintf、fprintf和printf这三个函数

    都是把格式好的字符串输出,只是输出的目标不一样:1 printf,是把格式字符串输出到标准输出(一般是屏幕,可以重定向).2 sprintf,是把格式字符串输出到指定字符串中,所以参数比printf多 ...

  3. jshzoi

    解题报告——2018级2016第二学期第一周作业   解题报告——2018级2016第二学期第一周作业 D 算24 题目描述 描述 给出4个小于10个正整数,你可以使用加减乘除4种运算以及括号把这4个 ...

  4. 第三天的学习知识HTML5常用的重要单词

    a:   a:猫     address:地址     alt:替用(一般是图片显示不出的提示) b:   b:粗体     br:换行     background:背景     border:边框 ...

  5. marquee 标签 文字滚动

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. CSUOJ_1002

    /* * Title : A+B(III) * Data : 2016/11/09 * Author : Andrew */ #include <iostream> #include &l ...

  7. 阿里云产品搭建web应用梳理

    阿里云搭建web应用梳理         要搭建web应用,主要需要准备两部分内容,一部分是域名,另一部分就是服务器.下面分别对在阿里如何准备这两部分内容做一个简要说明. 一.域名       提供域 ...

  8. Android开发之Git配置

    Android开发之Git配置 1.首先git配置: 输入命令: git config --global user.name "xxx.xx" git config --globa ...

  9. 使用requestAnimationFrame做动画效果二

    3月是个好日子,渐渐地开始忙起来了,我做事还是不够细心,加上感冒,没精神,今天差点又出事了,做过的事情还是要检查一遍才行,哎呀. 使用requestAnimationFrame做动画,我做了很久,终于 ...

  10. SPSS数据分析—对应分析

    卡方检验只能对两个分类变量之间是否存在联系进行检验,如果分类变量有多个水平的话,则无法衡量每个水平间的联系.对此,虽然可以使用逻辑回归进行建模,但是如果分类变量的水平非常多,就需要分别设定哑变量,这样 ...