Oracle兩張表關聯批量更新其中一張表的數據

創建如下表數據

select * from t1 ;

select * from t2;

現需求:參照T2表,修改T1表,修改條件爲兩表的fname列內容一致。

方式1,update

常見陷阱:

UPDATE T1 
SET T1.FMONEY = (select T2.FMONEY from t2 where T2.FNAME = T1.FNAME)

執行後T1結果如下:

有一行原有值,被更新成空值了。

正確寫法:推薦

UPDATE T1 
SET T1.FMONEY = (select T2.FMONEY from t2 where T2.FNAME = T1.FNAME)
WHERE EXISTS(SELECT 1 FROM T2 WHERE T2.FNAME = T1.FNAME);

方式2:內聯視圖更新

UPDATE (
select t1.fmoney  fmoney1,t2.fmoney  fmoney2 from t1,t2 where t1.fname = t2.fname
)t
set fmoney1 =fmoney2;

方式3:merge更新

merge into t1
using (select t2.fname,t2.fmoney from t2) t
on (t.fname = t1.fname)
when matched then 
  update  set t1.fmoney = t.fmoney;

 

方法一(推薦):

UPDATE 表2
  SET 表2.C =
     (SELECT B
       FROM 表1
      WHERE 表1.A = 表2.A)
 WHERE EXISTS
     (SELECT 1
       FROM 表1
      WHERE 表1.A = 表2.A);

尤其注意最後的外層where條件尤爲重要,是鎖定其批量更新數據的範圍。

方法二:

MERGE INTO 表2
   USING 表1
    ON (表2.A = 表1.A)                    -- 條件是 A 相同
WHEN MATCHED
THEN
  UPDATE SET 表2.C = 表1.B                   -- 匹配的時候,更新

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章