MERGE的用法

本文介绍在SQL中如何通过MERGE语句实现数据的更新与插入操作,包括删除特定记录、添加不同数据、全量插入及条件插入等场景,并讨论了相关注意事项。

在进行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: 无法在源表中获得一组稳定的行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值