MERGE INTO target_table t
USING (source_query) s
ON (t.key = s.key)
WHEN MATCHED THEN
UPDATE SET t.col1 = s.col1, t.col2 = s.col2
WHEN NOT MATCHED THEN
INSERT (key, col1, col2) VALUES (s.key, s.col1, s.col2);
MERGE INTO table1 a
USING (SELECT id, name FROM table2) b
ON (a.id = b.id)
WHEN MATCHED THEN
UPDATE SET a.name = b.name
WHEN NOT MATCHED THEN
INSERT (id, name) VALUES (b.id, b.name);
ON (a.id = b.id AND a.type = b.type)
WHEN MATCHED THEN
UPDATE SET a.name = b.name
WHERE a.status <> 'LOCKED' -- 僅更新非鎖定狀態
WHEN MATCHED THEN
UPDATE SET ...
DELETE WHERE a.flag = 'D' -- 更新後符合條件再刪除
-- 僅插入新資料
WHEN NOT MATCHED THEN INSERT ...
-- 僅更新既有資料
WHEN MATCHED THEN UPDATE ...
/*+ LEADING(s) USE_HASH(t) */ Hint 引導最佳路徑MERGE vs 獨立 INSERT+UPDATE: MERGE 為單一陳述式,原子性更強,減少網路往返與鎖定競爭,是 ETL 與資料同步首選。