PL/SQL 多表關聯UPDATE


假設有兩個表A和B,A表字段a,b,c,d,B表字段b,e,f,兩表的關聯條件是字段b,現在想做個data patch,欲將B表中的字段e的值patch給A表的字段c.

有如下兩種方法:

update A set A.c=(select e from B where B.b=A.b)
where exists(select 1 from B where B.b=A.b);

2

merge into A
using B
on (A.b=B.b)
when matched then update set A.c=B.e;

上面兩種方法都可以實現多表聯結的更新,其中的B表也可以是子查詢,視圖。

merge into是oracle 9i之后添加的語法,可以實現update/insert的功能(滿足條件更新,不滿足條件插入),而且效率要高,因為用merge只需要一次全表掃描,但merge into的使用需要小心,必須理解它的用法才能放心使用,否則有可能出現問題。

上面的例子不僅僅可以更新單個字段,也可以更新多個字段,如下:

1

update A set A.c=(select e from B where B.b=A.b),
             A.d=(select f from B where B.b=A.b)
where exists(select 1 from B where B.b=A.b);

2

merge into A
using B
on (A.b=B.b)
when matched then update set A.c=B.e,
                             A.d=B.f;

還有更復雜的情況,多個字段的更新來自於不同的表,比如A表的d字段來源於C表的某個字段,個人覺得這種情況不需要寫在一個sql文中,分成兩個sql文就行。

在網上看到這么一句話,”在一個同時存在Insert和Update語法的Merge語句中,總共Insert/Update的記錄數,就是Using語句中alias2的記錄數”。個人覺得並不對,這個結論的前提應該是源表和目標表之間關聯的字段都是唯一約束的,在我的例子中,B表的b字段作為主鍵,而A表的b字段可以重復,如果說B表的數據有4條,A表中對應B表的每條記錄都有兩條數據,那么實際上更新的記錄數為8條,更不談再加上not matche的 insert語句了。

各位如果有什么覺得不對的,麻煩指出來,謝謝嘍。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM