Oracle中兩表對比更新的兩種方法
阿新 • • 發佈:2021-02-06
表T_1 表T_2
這兩個表的特點是T_1的主鍵【ID】在T_2裡並不是主鍵。
---------------------------------------------------------------
一、根據表T_1的name、sex列更新表T_2的name、sex列:
UPDATE (SELECT T1.NAME n1, T2.NAME n2, T1.SEX s1, T2.SEX s2 FROM T_1 T1 INNER JOIN T_2 T2 ON T1.ID = T2.ID) SET n2 = n1, s2 = s1;
二、根據表T_2的name、sex列更新表T_1的name、sex列:
UPDATE T_1 T1
SET (T1.NAME, T1.SEX) =
(SELECT NAME, SEX
FROM T_2 T2
WHERE T1.ID = T2.ID AND ROWNUM < 2)
WHERE EXISTS
(SELECT 1
FROM T_2 T2
WHERE T1.ID = T2.ID);
三、ORA-01779錯誤
Oracle中試圖對一個子查詢進行更新時可能會出現ORA-01779錯誤。該錯誤的內容為:
ORA-01779: cannot modify a column which maps to a non-key-preserved table
BYPASS_UJVC的作用是跳過Oracle的鍵檢查。 這樣雖然能夠執行了,但是如果test2中存在不唯一的資料,test1就會被更新多次而導致意想不到的結果。
例如:
UPDATE (SELECT /*+ BYPASS_UJVC */ h.address a, r.regionname || b.bldname || c.cellname || h.showname b FROM arc_houseinfo h INNER JOIN arc_cellinfo c ON c.bldno = h.bldno AND c.cellno = h.cellno AND c.houseprop = h.houseprop INNER JOIN arc_bldinfo b ON b.bldno = c.bldno INNER JOIN arc_regioninfo r ON r.regionno = b.regionno WHERE r.regionno = '03000916') SET a = b;
注意:
以上方法不適用於11g,從11g開始不再支援該提示了。建議使用MERGE INTO;