SQL中Merge的用法
MERGE關鍵字是一個神奇的DML關鍵字,它能將INSERT,UPDATE,DELETE等操作併為一句,根據與源表聯接的結果,對目標表執行插入、更新或刪除操作。 |
MERGE關鍵字是一個神奇的DML關鍵字,它能將INSERT,UPDATE,DELETE等操作併為一句,根據與源表聯接的結果,對目標表執行插入、更新或刪除操作。
MERGE INTO target_table
USING source_table
ON condition
WHEN MATCHED THEN
operation
WHEN NOT MATCHED THEN
operation;
注意:其中最後語句分號不可以省略,且源表既可以是一個表也可以是一個子查詢語句。
merge無法多次更新同一行,也無法更新和刪除同一行
當源表和目標表不匹配時:
- 若資料是源表有目標表沒有,則進行插入操作;
- 若資料是源表沒有而目標表有,則進行更新或者刪除資料操作
當源表和目標表匹配時:
- 進行更新操作或者刪除操作
- 資料同步
- 資料轉換
- 基於源表對目標表做INSERT,UPDATE,DELETE操作
我們常用的是第三種場景
- 在 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,我們以Customers表和Orders表為例。資料如下:
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表裡的結果:
我們發現與Customers表裡匹配上的訂單日期被修改了,訂單日期往後推遲了一小時,而沒有匹配上的在訂單表尾部增加了幾行記錄。這就是MERGE的實際應用了。
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輸出剛剛變動過的資料
執行上述語句結果如下:
從上圖我們看到,執行的動作都是更新,這裡的動作只有UPDATE和DELETE,插入也屬於更新,此外我們看到訂單日期又往後推遲了一小時,是因為我們又一次執行了往後增加一小時的更新操作,其他的欄位沒變。
MERGE功能比較豐富,以上我們只是簡單介紹了一些常用功能,還有其他一些用法,有興趣的可以搜尋一下並動手嘗試。在我們要對錶做多種操作時,這種寫法不僅可以節省程式碼,而且有時候還可以提高執行效率。
- 容器雲架構–瞭解 Kubernetes 網路模型
- IPv6的發展已步入新階段
- docker中安裝mycat
- spring boot 不連線資料庫啟動
- ECharts 餅圖繪製教程
- 刪除字串中的所有相鄰重複項
- 超全面的Linux基礎知識的梳理
- Mysql使用儲存過程快速新增百萬資料
- 帶你玩玩轉 MySQL 查詢
- SQL中Merge的用法
- 在docker中haproxy的安裝以及mysql的負載均衡配置
- Centos8中如何更改資料夾中多個檔案的副檔名
- 如何在 Windows 中檢查計算機正常執行時間
- ECharts 互動元件概述
- 如何在 Linux 中以指令碼模式執行 Top
- ECharts 樣式設定介紹
- Python中非常有用的三個資料科學庫
- 六個方法助您優化雲端儲存成本
- ssl證書無效的原因是什麼?
- 只要有心,學好Linux並非難事