對於Oracle的兩表聯合更新的場景(有A、B兩表,以A.id=B.id關聯,根據B表中的記錄更新A表中的相應字段),一般有update內聯視圖和merge兩種方式,下面舉例介紹:
創建用例表:
create table test1(id number(10),name varchar2(20));
create table test2(id number(10),name varchar2(20));
測試數據:
begin
insert into test1 values(1,'A');
insert into test1 values(2,'B');
insert into test2 values(1,'C');
insert into test2 values(2,'D');
end;
merge方式:
merge into test1 using test2
on (test1.id = test2.id)
when matched then update
set test1.name = nvl2(test1.name,test2.name,test1.name);
merge方法是最簡潔,效率最高的方式,在大數據量更新時優先使用這種方式。
update內聯視圖方式:
使用這種方式必須在test2.id上有主鍵(這里很好理解,必須保證每一個test1.id對應在test2里只有一條記錄,如果test2中有多條對應的記錄,怎么更新test1?),一般而言這種方式代價比merge方式稍高。
alter table test2 add constraint pk_test2 primary key(id); --/*+ BYPASS_UJVC */
update (select /*+ BYPASS_UJVC */a.id aid,a.name aname,b.id bid,b.name bname from test1 a,test2 b where a.id=b.id) t
set aname = nvl2(aname,bname,aname);
使用並行,加快大量數據更新:
merge /*+parallel(test1,4)*/ into test1 using test2
on (test1.id = test2.id)
when matched then update
set test1.name = nvl2(test1.name,test2.name,test1.name);
