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功能比較豐富,以上我們只是簡單介紹了一些常用功能,還有其他一些用法,有興趣的可以搜尋一下並動手嘗試。在我們要對錶做多種操作時,這種寫法不僅可以節省程式碼,而且有時候還可以提高執行效率。
原文來自:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2790687/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- sql server merge 的用法SQLServer
- oracle中merge into用法解析Oracle
- SQL 中With as 的用法SQL
- Java 8 中 Map 騷操作之 merge() 的用法Java
- MySQL中merge表儲存引擎用法MySql儲存引擎
- SQLServer MERGE 用法SQLServer
- oracle merge into用法Oracle
- SQL Server中的Merge關鍵字SQLServer
- oracle中merge的用法,以及各版本的區別 CreateOracle
- SQL中的遞迴用法SQL遞迴
- SQL Server中@@ROWCOUNT的用法SQLServer
- SQL Server中distinct的用法SQLServer
- 轉 sql 中 case 的用法SQL
- sql merge intoSQL
- pl/sql中bulk collect的用法SQL
- oracle merge into 用法詳解Oracle
- ORACLE merge用法詳解Oracle
- SQL資料庫中Truncate的用法SQL資料庫
- sql中union和union all的用法SQL
- SQL中的case when then else end用法SQL
- SQL Server中的dbcc page命令用法SQLServer
- SQL Server中的dbcc ind命令用法SQLServer
- SQL中IN和EXISTS用法的區別SQL
- oracle merge into用法(R1)Oracle
- oracle-merge用法詳解Oracle
- Oracle PL/SQL中EXCEPTION用法OracleSQLException
- SQL Server 2008中的新語句:MERGESQLServer
- 深入SQL之merge intoSQL
- SQL AS 的用法SQL
- SQL Server中的鎖型別及用法SQLServer型別
- sql中的group by 和 having 用法解析SQL
- SQL中IN,NOT IN,EXISTS,NOT EXISTS的用法和差別SQL
- oracle-merge用法詳解 (轉)Oracle
- sql中as的用法和一些經典的sql語句SQL
- 【原】關於Oracle Merge操作的簡單用法Oracle
- SQL中 CONVERT轉化函式的用法SQL函式
- SQL中CONVERT轉化函式的用法SQL函式
- SQL server 中SUBSTRING()以及CONVERT()的用法SQLServer