首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Oracle 更新語句避免子查詢無匹配導致 NULL:使用 WHERE EXISTS 或 MERGE

     編輯:程式設計綜合問答

問題場景


-- t1 全量更新,t2 只有部分 id
UPDATE t1 a SET a.name = (SELECT b.name FROM t2 b WHERE a.id = b.id);
-- t1 中 id=3 在 t2 無對應 → name 變 NULL

方案一:WHERE EXISTS 過濾


UPDATE t1 a
SET a.name = (SELECT b.name FROM t2 b WHERE a.id = b.id)
WHERE EXISTS (SELECT 1 FROM t2 b WHERE a.id = b.id);
-- 僅更新 t2 存在的 id,其餘保持原值

方案二:MERGE 語句(Oracle 9i+,功能更強)


MERGE INTO t1 a
USING (SELECT id, name FROM t2) b
ON (a.id = b.id)
WHEN MATCHED THEN UPDATE SET a.name = b.name
-- 可選:WHEN NOT MATCHED THEN INSERT ...
;

方案三:LEFT JOIN 更新(Oracle 10g+ 支援 ANSI JOIN 更新)


UPDATE (
    SELECT a.name AS t1_name, b.name AS t2_name
    FROM t1 a LEFT JOIN t2 b ON a.id = b.id
)
SET t1_name = t2_name
WHERE t2_name IS NOT NULL;

效能比較

方案優點缺點
WHERE EXISTS語法簡單、相容舊版子查詢執行兩次(可用 MATERIALIZE HINT 優化)
MERGE單掃描、支援 INSERT/DELETE、可並行語法較長、需唯一鍵保證
LEFT JOIN可讀性好、易擴充多欄位舊版不支援、需 inline view

原答案核心

「update t1 A a set name= ( select b.name from t2 B where ID = a.ID ) where exists(select t2 1 from B where ID = a.ID )」

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved