首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 教學

Oracle MERGE INTO USING 語法詳解:單一陳述式完成 UPSERT

     編輯:Oracle 教學

MERGE 基本語法結構

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

執行邏輯解析

  1. USING 子查詢 產生來源資料集(可為表、視圖、子查詢)
  2. ON 條件 比對目標表與來源資料的關鍵欄位
  3. MATCHED:關鍵值相符 → 執行 UPDATE
  4. NOT MATCHED:關鍵值不符 → 執行 INSERT

進階用法

1. 多條件比對

ON (a.id = b.id AND a.type = b.type)

2. MATCHED 時加條件(10g+)

WHEN MATCHED THEN
    UPDATE SET a.name = b.name
    WHERE a.status <> 'LOCKED'  -- 僅更新非鎖定狀態

3. DELETE 子句(10g+)

WHEN MATCHED THEN
    UPDATE SET ...
    DELETE WHERE a.flag = 'D'  -- 更新後符合條件再刪除

4. 僅 INSERT / 僅 UPDATE

-- 僅插入新資料
WHEN NOT MATCHED THEN INSERT ...

-- 僅更新既有資料
WHEN MATCHED THEN UPDATE ...

效能優化提示

  • ON 條件欄位務必有索引
  • USING 子查詢建議加 /*+ LEADING(s) USE_HASH(t) */ Hint 引導最佳路徑
  • 大量資料考慮分批次 Commit,避免 Undo 爆滿

MERGE vs 獨立 INSERT+UPDATE: MERGE 為單一陳述式,原子性更強,減少網路往返與鎖定競爭,是 ETL 與資料同步首選。

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