001-Merge into 用法

001-Merge into 用法Mergeinto用法Mergeinto用法1、语法2、示例2.1实现一次更新操作2.2实现一次插入操作3、注意事项3.1using语句查询结果不能为空3.2被更新的列不能作为on过滤条件Mergeinto用法使用MERGE语句从一个或多个源中选择行,以便更新或插入表或视图。您可以指定条件来决定是否更新或插入目标表或视图。此语句是组合多个操作的方便方法。它允许您…

Merge into 用法

使用 MERGE 语句从一个或多个源中选择行,以便更新或插入表或视图。您可以指定条件来决定是否更新或插入目标表或视图。

此语句是组合多个操作的方便方法。它允许您避免多次插入、更新和删除DML语句。

MERGE 是一个确定性语句。不能在同一 MERGE 语句中多次更新目标表的同一行。

注意
Oracle 数据库在合并语句期间不实现细粒度访问控制。如果在目标表或多个表上使用细粒度访问控制特性,则使用等效的 INSERT 和 UPDATE 语句,而不是 MERGE,以避免错误消息,并确保正确的访问控制。

1、语法

MERGE INTO table_name alias1
USING (table | view | sub_query) alias2
ON (join condition)
WHEN MATCHED THEN
  DDL OR DML 语句
WHEN NOT MATCHED THEN
  INSERT (col_list) VALUES (col_values);

using
使用USING子句指定要更新或插入的数据的源。源可以是表、视图或子查询的结果。

on
使用ON子句指定合并操作更新或插入的条件。对于搜索条件为真的目标表中的每一行,Oracle数据库都会用源表中的相应数据更新该行。如果条件对任何行都不为真,则数据库将基于对应的源表行插入目标表。

delete where
delete where 子句是在填充或更新表时清理表中的数据。删除数据必须包含在 on 子句定义的连接中,否则不会删除数据。

  • delete where 需要跟在填充或更新表操作的后面。
  • 删除的数据必须包含在 on 子句定义的连接中。

2、示例

原表数据:
在这里插入图片描述

2.1 实现一次更新操作

merge into emp a 
using (select 4 as empno from dual) b
on (a.empno = b.empno)
when matched then
	update set a.ename = 'kitty'
when not matched then
	insert (empno,ename) values(4,'hahahaha');

再次查询表结果:
在这里插入图片描述

2.2 实现一次插入操作

merge into emp a 
using (select 5 as empno from dual) b
on (a.empno = b.empno)
when matched then
	update set a.ename = 'aaaaaa'
when not matched then
	insert (empno,ename) values(5,'hahahaha');

再次查询表结果:
在这里插入图片描述

2.3 更新、删除操作同时完成

delete where 子句是在填充或更新表时清理表中的数据。删除数据必须包含在 on 子句定义的连接中,否则不会删除数据。

  • delete where 需要跟在填充或更新表操作的后面。
  • 删除的数据必须包含在 on 子句定义的连接中。

示例:
原始数据
在这里插入图片描述

merge into emp a 
using (select 5 as empno from dual) b
on (a.empno < b.empno)
when matched then
  update set a.ename = 'DDD'
  DELETE WHERE a.empno = 4
when not matched then
	insert (empno,ename) values(5,'hahahaha');

执行 merge into 语句后的表数据:
在这里插入图片描述

3、注意事项

3.1 using 语句查询结果不能为空

如果 using 中的语句没有查询出数据(查询结果为空),是不会执行 update 和 insert 语句的,因为这个语法是根据 using 中的查询数据进行判断的。如果 using on 能在目标表中匹配到数据,则执行更新操作,否则执行插入操作。
例:

merge into emp a 
using (select empno from emp where empno = 6) b
on (a.empno = b.empno)
when matched then
	update set a.ename = 'aaaaaa'
when not matched then
	insert (empno,ename) values(6,'BBBBBB');

在这里插入图片描述
由于 select empno from emp where empno = 6 查询结果为空,所以update操作和insert操作都没有执行。

3.2 被更新的列不能作为 on 过滤条件

例:

merge into emp a 
using (select ename from emp where ename = 'tom') b
on (a.ename = b.ename)
when matched then
	update set a.ename = 'CCC'
when not matched then
	insert (empno,ename) values(7,'DDD');

在这里插入图片描述

3.3 其他

  • on 后面的过滤条件是需要使用括号的。
  • insert 语句没有 into,也勿需指定表名。

参考:
https://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_9016.htm
https://www.jianshu.com/p/8f51ce60d9ba

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/37154.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注