Oracle Merge Into的用法详解
Oracle Merge Into的用法详解
薄荷基本语法
MERGE INTO 的用途 MERGE INTO 是Oracle 9i以后才出现的新的功能。那这个功能 是什么呢? 简单来说,就是:“
有则更新,无则插入
”; 从这句话里,应该可以理解到,merge into 操作一个对象’A’的时候,要有另外一个结果集做为源数据 ‘B’; ‘merge into’ 将B中的数据与A中的数据按照一定条件’C’进行对比,如果 A中数据满足C条件,则进行update操作,如果不满足条件 ‘C’,则进行insert操作。(请注意这种对应关系);语法结构
1
2
3
4
5MERGE 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 可以将匹配错误的记录记录到日志表中
可以用于单条数据的处理,也可以用于数据的批处理。对于merge into来说效率要比单独执行update+insert 操作效率要高。
但是请注意,using语句中的结果集 B不可以与merge into 的对象A相同,否则,会因为结果集A,B恒等。
当 on() 进行等值判断时,只可以进行update操作,不能进行insert 操作,当 on() 进行不等值判断时,只可以进行insert操作,不能进行update操作。
可能这样说还不是很清楚。下面我们实际操作演示,就会理解清楚了。
用法示例
先创建2张表,一张源表,一张目标表:
1 | create table src_table( |
两张表的数据如下:
1 | Select * from src_table; |
同时更新和插入
下面是最基本的用法,利用源表对目标表同时进行更新和插入
1 | merge into tgt_table t |
- When matched 为匹配存在的记录(id为1,3),更新了name, salary, age个字段
- When not match 为目标表不存在的记录(id为2),插入了该记录,同时bouns字段加50
- Matched 和 not matched的子句是独立的,可以任意选择一项,或同时出现
- 目标表中id为4的记录在源表中不存在(不满足连接条件),因此不会涉及
where子句
对于匹配的记录,可以使用where子句进一步限制范围
1 | merge into tgt_table t |
评论
匿名评论隐私政策
✅ 你无需删除空行,直接评论以获取最佳展示效果