-- 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
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 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 ...
;
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 )」