oracle中的merge into用法解析
Posted 模拟素素
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle中的merge into用法解析相关的知识,希望对你有一定的参考价值。
oracle中的merge into用法解析
merge into的形式
MERGE INTO [target-table] A USING [source-table sql] B ON([conditional expression] and [...]...)
WHEN MATCHED THEN
[UPDATE sql]
WHEN NOT MATCHED THEN
[INSERT sql]
merge into的形式
MERGE INTO [target-table] A USING [source-table sql] B ON([conditional expression] and [...]...)
WHEN MATCHED THEN
[UPDATE sql]
WHEN NOT MATCHED THEN
[INSERT sql]
作用:判断B表和A表是否满足on条件,如果满足则用B表去更新A表,如果不满足,则将B表数据插入A表,但有很多可选项。
例如:
1:正常模式
2:只update或者只insert
3:带条件的update或带条件的insert
4:全插入insert实现
5:带delete的update -------------------不做讲解
例如:
1:正常模式
2:只update或者只insert
3:带条件的update或带条件的insert
4:全插入insert实现
5:带delete的update -------------------不做讲解
一:正常模式
例如:
MERGE INTO A_MERGE A
USING (select B.AID,B.NAME,B.YEAR from B_MERGE B) C
ON (A.id=C.AID)
WHEN MATCHED THEN
UPDATE SET A.YEAR=C.YEAR
WHEN NOT MATCHED THEN
INSERT(A.ID,A.NAME,A.YEAR) VALUES(C.AID,C.NAME,C.YEAR);
commit;
例如:
MERGE INTO A_MERGE A
USING (select B.AID,B.NAME,B.YEAR from B_MERGE B) C
ON (A.id=C.AID)
WHEN MATCHED THEN
UPDATE SET A.YEAR=C.YEAR
WHEN NOT MATCHED THEN
INSERT(A.ID,A.NAME,A.YEAR) VALUES(C.AID,C.NAME,C.YEAR);
commit;
解析:
1:被更新的表写在MEGER INTO之后
2:更新来源数据表写在USING之后,并将相关字段查询出来,为查询结果定义别名
3:ON之后表示更新满足的条件
4:WHEN MATCHED THEN:表示当满足条件时要执行的操作。
5:UPDATE SET 被更新表.被更新字段 = 更新表.更新字段---此更新语句不同于常规更新语句
6:WHEN NOT MATCHED THEN:表示当不满足条件时要执行的操作。
7:INSERT (被更新表.被更新字段,...) VALUES(更新表.更新字段,...)。
8:commit:表示提交事务
1:被更新的表写在MEGER INTO之后
2:更新来源数据表写在USING之后,并将相关字段查询出来,为查询结果定义别名
3:ON之后表示更新满足的条件
4:WHEN MATCHED THEN:表示当满足条件时要执行的操作。
5:UPDATE SET 被更新表.被更新字段 = 更新表.更新字段---此更新语句不同于常规更新语句
6:WHEN NOT MATCHED THEN:表示当不满足条件时要执行的操作。
7:INSERT (被更新表.被更新字段,...) VALUES(更新表.更新字段,...)。
8:commit:表示提交事务
二:只update或只insert
-------------------------------只更新--------------------------------------------------------
-------------------------------只更新--------------------------------------------------------
merge into A_MERGE A USING (select B.AID,B.NAME,B.YEAR from B_MERGE B) C
ON(A.ID=C.AID)
WHEN MATCHED THEN
UPDATE SET A.YEAR=C.YEAR;
commit;
解析---只更新模式:
1:将正常模式下的插入语句去除。
2:使用WHEN MATCHED THEN,当满足条件的情况。
-------------------------------只插入--------------------------------------------------------
merge into A_MERGE A
USING (select B.AID,B.NAME,B.YEAR from B_MERGE B) C
ON(A.ID=C.AID)
WHEN NOT MATCHED THEN
insert(A.ID,A.NAME,A.YEAR) VALUES(C.AID,C.NAME,C.YEAR);
commit;
解析---只插入模式:
1:将正常模式下的更新操作去除
2:使用WHEN NOT MATCHED THEN,当不满足ON条件时执行插入操作。
ON(A.ID=C.AID)
WHEN MATCHED THEN
UPDATE SET A.YEAR=C.YEAR;
commit;
解析---只更新模式:
1:将正常模式下的插入语句去除。
2:使用WHEN MATCHED THEN,当满足条件的情况。
-------------------------------只插入--------------------------------------------------------
merge into A_MERGE A
USING (select B.AID,B.NAME,B.YEAR from B_MERGE B) C
ON(A.ID=C.AID)
WHEN NOT MATCHED THEN
insert(A.ID,A.NAME,A.YEAR) VALUES(C.AID,C.NAME,C.YEAR);
commit;
解析---只插入模式:
1:将正常模式下的更新操作去除
2:使用WHEN NOT MATCHED THEN,当不满足ON条件时执行插入操作。
三:带where条件的update和insert
我们在on中进行条件匹配之后,还可以在后面的insert和update中对on删选出来的记录再做一次条件判断,用来控制
那些需要更新,那些需要插入。
merge into A_MERGE A
USING (select B.AID,B.name,B.year,B.city from B_MERGE B) C
ON(A.id=C.AID)
when matched then
update SET A.name=C.name where C.city != ‘江西‘
when not matched then
insert(A.ID,A.name,A.year) values(c.AID,C.name,C.year) where C.city=‘江西‘;
commit;
我们在on中进行条件匹配之后,还可以在后面的insert和update中对on删选出来的记录再做一次条件判断,用来控制
那些需要更新,那些需要插入。
merge into A_MERGE A
USING (select B.AID,B.name,B.year,B.city from B_MERGE B) C
ON(A.id=C.AID)
when matched then
update SET A.name=C.name where C.city != ‘江西‘
when not matched then
insert(A.ID,A.name,A.year) values(c.AID,C.name,C.year) where C.city=‘江西‘;
commit;
解析:
1:当满足on条件并且满足where条件才会执行更新操作。
2:当不满足on条件但是满足where条件才会执行插入操作。
1:当满足on条件并且满足where条件才会执行更新操作。
2:当不满足on条件但是满足where条件才会执行插入操作。
四:无条件的insert
有时候我们需要将一张表的所有的数据插入到另一张表中,此时就可以添加常量过滤谓词来实现,让其只满足匹配和不匹配,
这样就只有update或insert操作了。
merge into C_MERGE C
USING (select B.AID,B.NAME,B.City from B_MERGE B) C
ON (1=0)
when not matched then
insert(C.ID,C.NAME,C.City) values(B.AID,B.NAME,B.City);
commit;
有时候我们需要将一张表的所有的数据插入到另一张表中,此时就可以添加常量过滤谓词来实现,让其只满足匹配和不匹配,
这样就只有update或insert操作了。
merge into C_MERGE C
USING (select B.AID,B.NAME,B.City from B_MERGE B) C
ON (1=0)
when not matched then
insert(C.ID,C.NAME,C.City) values(B.AID,B.NAME,B.City);
commit;
解析:
on条件处于永远不匹配的条件,此时就会执行全表插入操作。
on条件处于永远不匹配的条件,此时就会执行全表插入操作。
以上是关于oracle中的merge into用法解析的主要内容,如果未能解决你的问题,请参考以下文章
Oracle使用merge into 编写存储过程 遇编译错误:PL/SQL: ORA-00926: 缺失 VALUES 关键字
Oracle使用merge into 编写存储过程 遇编译错误:PL/SQL: ORA-00926: 缺失 VALUES 关键字