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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SQLServer MERGE 用法SQLServer
- merge into 用法深思
- merge into基本用法
- sql merge intoSQL
- Java 8 中 Map 騷操作之 merge() 的用法Java
- SQL中的遞迴用法SQL遞迴
- SQL資料庫中Truncate的用法SQL資料庫
- sql中union和union all的用法SQL
- SQL AS 的用法SQL
- SQL 高階語法 MERGE INTOSQL
- merge sql error, dbType sqlserver, druid1.1.10, sql : nullSQLErrorServerUINull
- SQL語句IN的用法SQL
- sql devloper 用法的和SQL 編寫SQLdev
- SQL語句中不同的連線JOIN及SQL中join的各種用法SQL
- Oralce 使用SQL中的exists 和not exists 用法詳解SQL
- SQL中的case when then else end用法 【詳細】轉載SQL
- SQL Server中row_number函式的常見用法SQLServer函式
- Sql server with as update用法SQLServer
- SQL groupby sum 用法SQL
- SQL Server的Merge —— 一步實現 insert,update,deleteSQLServerdelete
- 常見的錯誤 SQL 用法SQL
- sql - distinct 去重複的用法SQL
- Elasticsearch SQL用法詳解ElasticsearchSQL
- SQL LEN()函式用法SQL函式
- MogDB/openGauss中merge的語法解析
- Git中merge和rebase的區別Git
- ORACLE sql merge into update where條件位置與效能消耗OracleSQL
- SQL Server資料庫中Substring函式的用法例項詳解SQLServer資料庫函式
- 一張圖說明SQL的join用法SQL
- Java中的Json Path和Json Merge PatchJavaJSON
- T-SQL:CTE用法(十)SQL
- js中的this用法JS
- 簡單練習Microsoft SQL Server MERGE同步兩個表ROSSQLServer
- 一張圖看懂 SQL 的各種 join 用法SQL
- MySQL常見的8種SQL錯誤用法MySql
- SQL函式Group_concat用法SQL函式
- MYSQL中replace into的用法MySql
- MySQL中limit的用法MySqlMIT