oracle里update where,MERGE新特性(UPDATE WHERE,DELETE WHERE,INSERT WHERE)-Oracle

Oracle MERGE语句结合了UPDATE和INSERT的功能,提高执行效率。在Oracle10g中,它有四点显著改进:1) 可单独使用WHEN MATCHED THEN或WHEN NOT MATCHED THEN;2) UPDATE和INSERT子句可加WHERE子句;3) ON条件可用常量过滤,实现批量操作;4) 支持在MATCHED情况下执行DELETE。例如,根据条件更新或删除A表中与B表匹配的数据,简化了复杂的数据处理逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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的数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值