1. 程式人生 > 其它 >Oracle中兩表對比更新的兩種方法

Oracle中兩表對比更新的兩種方法

技術標籤:Oracle技術oracle資料庫

表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 */
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;