在进行SQL语句编写时,当存在记录时,就更新(Update),不存在数据时,就插入(Insert)
表结构
SQL> select * from t1;
NAME MONEY
-------------------- ----------
A 10
B 20
SQL> select * from t2;
NAME MONEY
-------------------- ----------
A 30
C 20
1.删除t2中已存在于t1中的数据,即删除记录A
merge into t2
using t1
on(t1.name=t2.name)
when matched then
update set t2.money=t2.money --这里update必须保留,否则报错
delete where (t1.name=t2.name) --删除时只会针对目标表:t2,delete where (t1.name='A')也是对t2表中存在A记录的删除
SQL> select * from t2;
NAME MONEY
-------------------- ----------
C 20
2.将t1中不同于t2的记录添加至t2
merge into t2
using t1
on(t1.name=t2.name)
when not matched then
insert(name,money) values(t1.name,t1.money);
SQL> select * from t2;
NAME MONEY
-------------------- ----------
A 30
C 20
B 20
3.将t1中所有数据插入到t2
merge into t2
using t1
on (1=0) --这里设立false条件即可
when not matched then insert(name,money) values(t1.name,t1.money);
SQL> select * from t2;
NAME MONEY
-------------------- ----------
A 30
C 20
A 10
B 20
4.在插入时设立条件
merge into t2
using t1
on(t1.name=t2.name)
when matched then
update set t2.money=t2.money+t1.money
where t2.money>40; --即使匹配,插入时必须要求money>40
SQL> select * from t2;
NAME MONEY
-------------------- ----------
A 30
C 20
5.insert和update的联合使用,向t2表中插入没有的数据,对t2中与t1重复的数据更新
MERGE INTO t2 a
using (select name,money from t1) b
on(a.name=b.name)
when matched then update set a.money=a.money+b.money
when not matched then insert(name,money) values(b.name,b.money);
SQL> select * from t2;
NAME MONEY
-------------------- ----------
A 40
C 20
B 20
需要注意的几点:
1.如果t1中存在多条(A,10)记录,即于t2表中的一条(A,30)记录形成多对一的关系,那么merge时会出现ORA-30926: 无法在源表中获得一组稳定的行
SQL> select * from t1;
NAME MONEY
-------------------- ----------
A 10
B 20
A 10
SQL> merge into t2
2 using t1
3 on(t1.name=t2.name)
4 when matched then update set t2.money=t1.money+t2.money
5 when not matched then insert values(t1.name,t1.money);
using t1
*
第 2 行出现错误:
ORA-30926: 无法在源表中获得一组稳定的行
本文介绍在SQL中如何通过MERGE语句实现数据的更新与插入操作,包括删除特定记录、添加不同数据、全量插入及条件插入等场景,并讨论了相关注意事项。


被折叠的 条评论
为什么被折叠?



