merge into

点击(此处)折叠或打开

  1. create table base_tab (name varchar2(20),age number, address varchar2(100));
  2. insert into base_tab values('任我行',56,'山东');
  3. insert into base_tab values('风清扬',107,'湖南');
  4. insert into base_tab values('孙悟空',5000000,'湖北');
selet * from base_tab;


点击(此处)折叠或打开

  1. insert into up_tab values('姚明',1,30,'上海','上海交通');
  2. insert into up_tab values('范冰冰',2,40,'北京','文盲');
  3. insert into up_tab values('邵佳一',3,35,'北京','未知');
  4. insert into up_tab values('任我行',4,56,'山东','私塾');
  5. insert into up_tab values('任我行',5,32,'河北','不详');
  6. select * from up_tab

现在要将up_tab中的姓名,年龄,地址信息更新到base_tab中,如果基本表base_tab中没有更新表up_tab中的信息,那么就直接插入,如果有就按照up_tab进行更新。

点击(此处)折叠或打开

  1. merge into base_tab b
  2. using (select name,age,address from up_tab) u
  3. on (b.name=u.name)
  4. when matched then update set b.age=u.age,b.address=u.address
  5. when not matched then insert values(u.name,u.age,u.address);
ORA-30926: unable to get a stable set of rows in the source tables
违反约束条件了,merge在做update子句的时候,只能处理1对1或1对0的关系,不能处理多对1或多对多的关系,否则会导致ora-30926 错误。

之后删除id=5的数据,更新通过。


但是生成上基本不用merge into 更新插入表,如果要更新插入2000w行数据,其一是大事务产生undo多,其二会锁表,生产上使用游标更新,即每1000行更新。
update不如 merge的情况:( 多表关联更新的情况)

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29990276/viewspace-1631837/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29990276/viewspace-1631837/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值