SQL中Merge的用法

大雄45發表於2021-11-08
導讀 MERGE關鍵字是一個神奇的DML關鍵字,它能將INSERT,UPDATE,DELETE等操作併為一句,根據與源表聯接的結果,對目標表執行插入、更新或刪除操作。

SQL中Merge的用法SQL中Merge的用法

MERGE的定義

MERGE關鍵字是一個神奇的DML關鍵字,它能將INSERT,UPDATE,DELETE等操作併為一句,根據與源表聯接的結果,對目標表執行插入、更新或刪除操作。

MERGE的語法

MERGE INTO target_table

USING source_table

ON condition

WHEN MATCHED THEN

operation

WHEN NOT MATCHED THEN

operation;

注意:其中最後語句分號不可以省略,且源表既可以是一個表也可以是一個子查詢語句。

MERGE的用法

merge無法多次更新同一行,也無法更新和刪除同一行

當源表和目標表不匹配時:

  • 若資料是源表有目標表沒有,則進行插入操作;
  • 若資料是源表沒有而目標表有,則進行更新或者刪除資料操作
  • 當源表和目標表匹配時:

  • 進行更新操作或者刪除操作
  • MERGE的使用場景
  • 資料同步
  • 資料轉換
  • 基於源表對目標表做INSERT,UPDATE,DELETE操作
  • 我們常用的是第三種場景

    MERGE使用限制
  • 在 MERGE MATCHED 操作中,只能允許執行 UPDATE 或者 DELETE 語句。
  • 在 MERGE NOT MATCHED 操作中,只允許執行 INSERT 語句。
  • 一個 MERGE語句中出現的MATCHED操作,只能出現一次 UPDATE 或者 DELETE 語句,否則就會出現下面的錯誤: An action of type 'WHEN MATCHED' cannot appear more than once in a 'UPDATE' clause of a MERGE statement.
  • MERGE示例

    下面我們通過一個示例來介紹一下該如何使用MERGE,我們以Customers表和Orders表為例。資料如下:

    SQL中Merge的用法SQL中Merge的用法

    SQL中Merge的用法SQL中Merge的用法

    Q:當Customers表裡的客戶有購買商品,我們就更新一下他們的下單時間,將他們的下單時間往後推遲一小時,如果客戶沒有購買商品,那麼我們就將這些客戶的資訊插入到訂單表裡。

    根據上面的要求我們可以這樣寫SQL:

MERGE INTO Orders O 
--確定目標表Orders 
USING Customers C ON C.客戶ID=O.客戶ID   
--從源表Customers確定關聯條件 C.客戶ID=O.客戶ID 
WHEN MATCHED   
--當匹配時對目標表的訂單日期執行更新操作 
THEN UPDATE SET O.訂單日期=DATEADD(HOUR,1,O.訂單日期) 
WHEN NOT MATCHED BY TARGET 
--當不匹配時對目標表進行插入操作 
THEN INSERT (客戶ID,員工ID,訂單日期,發貨ID) 
VALUES (C.客戶ID,NULL,NULL,NULL)

我們看一下Orders表裡的結果:

SQL中Merge的用法SQL中Merge的用法

我們發現與Customers表裡匹配上的訂單日期被修改了,訂單日期往後推遲了一小時,而沒有匹配上的在訂單表尾部增加了幾行記錄。這就是MERGE的實際應用了。

OUTPUT子句

MERGE還能與OUTPUT一起使用,可以將剛剛做過變動的資料進行輸出,我們以上面的示例為基礎,進行示範。

MERGE INTO Orders O 
--確定目標表Orders 
USING Customers C ON C.客戶ID=O.客戶ID 
--從源表Customers確定關聯條件 C.客戶ID=O.客戶ID 
WHEN MATCHED  
--當匹配時對目標表的訂單日期執行更新操作 
THEN UPDATE SET O.訂單日期=DATEADD(HOUR,1,O.訂單日期) 
WHEN NOT MATCHED BY TARGET 
--當不匹配時對目標表進行插入操作 
THEN INSERT (客戶ID,員工ID,訂單日期,發貨ID) 
VALUES (C.客戶ID,NULL,NULL,NULL) 
OUTPUT $action AS [ACTION],Inserted.訂單日期 , 
Inserted.客戶ID,Inserted.發貨ID,Inserted.員工ID 
--用OUTPUT輸出剛剛變動過的資料

執行上述語句結果如下:

SQL中Merge的用法SQL中Merge的用法

從上圖我們看到,執行的動作都是更新,這裡的動作只有UPDATE和DELETE,插入也屬於更新,此外我們看到訂單日期又往後推遲了一小時,是因為我們又一次執行了往後增加一小時的更新操作,其他的欄位沒變。

總結

MERGE功能比較豐富,以上我們只是簡單介紹了一些常用功能,還有其他一些用法,有興趣的可以搜尋一下並動手嘗試。在我們要對錶做多種操作時,這種寫法不僅可以節省程式碼,而且有時候還可以提高執行效率。

原文來自:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2790687/,如需轉載,請註明出處,否則將追究法律責任。

相關文章