MERGE新特性(UPDATE WHERE,DELETE WHERE,INSERT WHERE)

原创 2013年12月04日 11:08:03

MERGE语句是Oracle9i新增的语法,用来合并UPDATE和INSERT语句。
通过MERGE语句,根据一张表或子查询的连接条件对另外一张表进行查询,连接条件匹配上的进行UPDATE,无法匹配的执行INSERT。这个语法仅需要一次全表扫描就完成了全部工作,执行效率要高于INSERT+UPDATE。 
语法为
 *************************************************************
        MERGE [INTO [schema .] table [t_alias]
        USING [schema .] { table | view | subquery } [t_alias] 
        ON ( condition )
        WHEN MATCHED THEN merge_update_clause 
        WHEN NOT MATCHED THEN merge_insert_clause
**************************************************************
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的数据。

相关文章推荐

SQLite学习笔记三:Where, AND/OR, Update, Delete

SQLite Where语句 SQLite的 WHERE 子句用于指定从一个表或多个表中获取数据的条件。...

关于如何避免操作(update、delete)mysql数据库时忘记添加where而导致全表修改或删除情况

在实际开发中,有时在对数据库进行更新或删除时,因忘记添加了where条件而造成了对整表的更新或删除。OMG,从网上找了许多的如何恢复误操作的方法,都是通过查看日志转换成sql语句再进行恢复。(好麻烦啊...

03-SQLite3之insert、select、where

一、insert into语句用于向表格中插入新的行 语法:inert into 表名称 values(值1, 值2,....) 二、insert into在指定的列插入相关数据 ...

insert中加入where条件判断,解决插入重复数据的问题

对于会员注册,我们经常会做唯一性验证,通常情况下我们有这两种方式: 1. 数据库表设计的时候loginName增加唯一约束 2. 注册之前先查一下然后再去进行插入操作针对以上两种情况,第一种情况,...

SAS︱数据索引、数据集常用操作(set、where、merge、append)

代码部分大多来源于姚志勇老师的《SAS编程与数据挖掘商业案例》。 一、数据索引 数据索引的创建有三种方式:data步骤、sql步骤、datasets步骤。 其中还是有点困惑在data与datase...

truncate和不带where子句的delete, 以及drop都会删除表内的数据

相同点:truncate和不带where子句的delete, 以及drop都会删除表内的数据  不同点:  1. truncate和 delete只删除数据不删除表的结构(定义)       drop...

mysql update忘加where条件的操作恢复(模拟oracle闪回)

先准备数据: CREATE TABLE `student` (   `id` int(10) unsigned NOT NULL AUTO_INCREMENT,   `name` varchar...

for update 与where current of的问题

在刚学oracle时一直不明白for update 的作用,今天考试又遇到郁闷半天,所以加以整理。 一: 1>首先for update是对表的行进行锁定。锁定就好比我们学java Thread那一...
  • jzh440
  • jzh440
  • 2012年05月09日 20:28
  • 3080

PLSQL条件语句完成员工加薪功能(记录类型+游标case when+if+for update+where current of)

TEST1:请使用函数+plsql完成给员工加薪的功能。 CLERK 加薪 20%; SALESMAN 加薪30%; MANAGER 加薪35% SQL> select * from t; ...

数据库update语句中where后跟IN和EXISTS效率测试

数据库 update后where语句中的IN、EXISTS的效率测试
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MERGE新特性(UPDATE WHERE,DELETE WHERE,INSERT WHERE)
举报原因:
原因补充:

(最多只允许输入30个字)