-
create table base_tab (name varchar2(20),age number, address varchar2(100));
-
insert into base_tab values('任我行',56,'山东');
-
insert into base_tab values('风清扬',107,'湖南');
-
insert into base_tab values('孙悟空',5000000,'湖北');
selet * from base_tab;
-
insert into up_tab values('姚明',1,30,'上海','上海交通');
-
insert into up_tab values('范冰冰',2,40,'北京','文盲');
-
insert into up_tab values('邵佳一',3,35,'北京','未知');
-
insert into up_tab values('任我行',4,56,'山东','私塾');
-
insert into up_tab values('任我行',5,32,'河北','不详');
-
select * from up_tab
现在要将up_tab中的姓名,年龄,地址信息更新到base_tab中,如果基本表base_tab中没有更新表up_tab中的信息,那么就直接插入,如果有就按照up_tab进行更新。
-
merge into base_tab b
-
using (select name,age,address from up_tab) u
-
on (b.name=u.name)
-
when matched then update set b.age=u.age,b.address=u.address
-
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博客 ” ,链接:https://blog.itpub.net/29990276/viewspace-1631837/
,如需转载,请注明出处,否则将追究法律责任。