Oracle merge into语句(merge into Statement)
在Oracle中,常规的DML语句只能完成单一功能,,例如insert/delete/update只能三选一,而merge into语句可以同时对一张表进行更新/插入/删除。
目录
一、基本语法
二、用法示例
2.1 同时更新和插入
2.2 where子句
2.3 delete子句
2.4 记录同步错误
一、基本语法
merge into常用在数据同步的场景,它会选定一张基表作为数据源,然后与目标表的记录进行匹配,根据匹配的结果,可以对目标表同时进行更新/插入/删除操作。
语法:
MERGE INTO target_table USING source_table ON (join_condition) WHEN MATCHED THEN UPDATE SET … [WHERE …] [DELETE … WHERE …] WHEN NOT MATCHED THEN INSERT (column_list) VALUES (value_list) [WHERE …] LOG ERRORS INTO … REJECT LIMIT [integer|UNLIMITED]
- target_table 是要更新的表
- source_table 是参考表
- USING … ON () 是两个表的连接条件,用于判断记录是否匹配
- WHEN MATCHED 对于满足匹配条件的记录进行的操作,可以更新或删除
- WHEN NOT MATCHED 对于不满足匹配条件的记录,可以插入
- LOG ERRORS INTO 可以将匹配错误的记录记录到日志表中
二、用法示例
先创建2张表,一张源表,一张目标表:
create table src_table( id number(6), name varchar2(32), salary number(6), bonus number(6)); insert into src_table values(1,'Vincent',1000,100); insert into src_table values(2,'Victor',2000,200); insert into src_table values(3,'Grace',3000,300); create table tgt_table( id number(6), name varchar2(32), age number(6), salary number(6), bonus number(6)); insert into tgt_table values(1,'someone',1,0,0); insert into tgt_table values(3,'someone',3,0,0); insert into tgt_table values(4,'someone',4,0,0); commit;
两张表的数据如下:
Select * from src_table; Select * from tgt_table;
2.1 同时更新和插入
下面是最基本的用法,利用源表对目标表同时进行更新和插入
merge into tgt_table t using src_table s on (t.id=s.id) when matched then update set t.name=s.name, t.salary=s.salary, t.age=10 when not matched then insert values(s.id,s.name,10,s.salary,s.bonus+50); commit; select * from tgt_table;
- When matched 为匹配存在的记录(id为1,3),更新了name, salary, age个字段
- When not match 为目标表不存在的记录(id为2),插入了该记录,同时bouns字段加50
- Matched 和 not matched的子句是独立的,可以任意选择一项,或同时出现
- 目标表中id为4的记录在源表中不存在(不满足连接条件),因此不会涉及
2.2 where子句
对于匹配的记录,可以使用where子句进一步限制范围
merge into tgt_table t using src_table s on (t.id=s.id) when matched then update set t.bonus=s.bonus where s.id>=2; Select * from tgt_table order by id;
- 这里对匹配的记录bonus字段进行更新,同时进一步限制id>=2的记录才更新
- Where 子句的条件可以通过源表或者目标表指定,这里是通过源表的s.id指定
2.3 delete子句
在update子句后,还可以跟上delete … where …子句,对匹配上的记录进行删除操作
merge into tgt_table t using src_table s on (t.id=s.id) when matched then update set t.bonus=s.bonus+50 where s.id>=3 delete where id>=2; select * from tgt_table order by id;
- delete where id>=2 指定将ID大于等于2的记录删除,但注意id为2的记录并未被删除,只有3被删除了
- 因为delete只会在update匹配的到记录范围内删除,update子句有个where s.id>=3,delete也会受到这个条件的限制
- 实际执行的效果是 delete where s.id>=3 and id>=2,只有id为3的记录满足这个条件
- id为4的记录不在匹配范围内,不受merge into语句的影响,也不会被删除
2.4 记录同步错误
数据同步的时,源表和目标表的结构/数据类型/约束可能并不一致,这就导致数据同步可能部分失败,现在我们修改tgt表,限制salary字段值不能超过3000,即插入超过3000的数字将失败:
Alter table tgt_table modify salary number(6) check(salary
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!




