您的位置:首页 > 数据库 > Oracle

MERGE的用法

2014-01-10 10:19 369 查看
在进行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: 无法在源表中获得一组稳定的行
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  oracle database