【Oracle】merge into 合并数据的简单例子
更新日志:[2020-03-11]文章发布说明:本文地址《【Oracle】Merge into 合并数据的简单例子》https://关于 MaiXiaochaiCSDN:https://blog.csdn.net/maixiaochaiGitHub:https://github.com/MaiXiaochai1. 准备数据创建test_a 和te...
·
更新日志:
- [2020-03-11]
文章发布
说明:
1. 准备数据
- 创建
test_a
和test_b
两张结构相同的表,ID
字段为主键。并插入一些数据CREATE TABLE TEST_A ( ID NUMBER PRIMARY KEY, NAME NVARCHAR2(20) NOT NULL, UPDATEDON DATE); CREATE TABLE TEST_B ( ID NUMBER PRIMARY KEY, NAME NVARCHAR2(20) NOT NULL, UPDATEDON DATE); INSERT INTO test_a values(1, '张全蛋', sysdate); INSERT INTO test_a values(2, '如花', sysdate); INSERT INTO test_a values(3, '奥利给', sysdate); INSERT INTO test_a values(4, '《你的答案》', sysdate); INSERT INTO test_b values(3, '奥利给', sysdate); INSERT INTO test_b values(4, '《你的答案》', sysdate); INSERT INTO test_b values(5, '《起风了》', sysdate); INSERT INTO test_b values(6, '《River Flows In You》', sysdate);
- 注意:
test_a
和test_b
中都有id
为3
和4
的数据- 这两条数据
id
和name
字段的值表间对比相同 - 但
updatedon
字段值不同
2. Merge into
-
MERGE INTO test_b b USING(SELECT * FROM test_a) a ON (b.ID = a.ID) WHEN MATCHED THEN -- 注意,这里 update的时候,不要 update唯一约束包含的字段,这里指 ID字段 UPDATE SET b.NAME = a.NAME, b.UPDATEDON = a.UPDATEDON WHEN NOT MATCHED THEN INSERT( ID, NAME, UPDATEDON) VALUES( a.ID, a.NAME, a.UPDATEDON);
merge
后test_b
- 绿色框中为新插入的数据行
- 蓝色框中为被更新的数据行,
id
为3和4的数据的UPDATEDON
字段被更新了 - 简单说明
- 用结果集
a
的数据,通过和表test_b
比较ID
字段的值来进行数据合并 - 若
id
=a1
在a
和test_b
中都有,则用a1
在a
中的数据去更新a1
在test_b
中的数据,
也可以理解为把test_b
中的id
为a1
的数据删除,把a
中的id
为a1
的数据插入test_b
,但实际执行的时候并不是这样,只是将对应的字段更新了。 - 若
id
=a1
只在一个表中有- 只在
a
中,直接将id
为a1
的数据插入test_b
- 只在
test_b
中,不执行任何操作
- 只在
- 用结果集
3. 用法说明
-
MERGE INTO 要合并到的表 t USING( 用哪些数据去合并) s ON(按照哪个唯一约束去合并,多个字段用 AND 连接, 如 s.id=t.id AND s.name=t.id) -- 整个merge into 就是说id和name作为唯一约束(也就是通过这俩字段能定位到唯一一行数据), -- s、t交集部分id和name所确定的数据,用s中的数据,去更新t中的数据,不更新唯一约束所包含的字段 -- s - t 所组成的差集,id和name所确定的数据,直接插入 t WHEN MATCHED THEN -- 两表中满足 ON条件的数据,执行以下内容 UPDATE SET t.columns=s.columns --要更新哪些字段写哪些字段,但不要更新唯一约束中包含的字段(这里不要写id或者name字段) WHEN MATCHED THEN -- 两表中不满足ON条件的数据时执行以下内容 insert( t中的字段名) VALUES( s.字段名 );
The end.
更多推荐
已为社区贡献3条内容
所有评论(0)