一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Sql Server - 聊聊SQL中Merge的用法

聊聊SQL中Merge的用法

2021-08-16 23:37SQL數據庫開發丶平凡世界 Sql Server

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

聊聊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的用法

Customers

聊聊SQL中Merge的用法

Orders

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

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

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

(提示:代碼可以左右滑動)

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

聊聊SQL中Merge的用法

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

OUTPUT子句

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

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

執行上述語句結果如下:

聊聊SQL中Merge的用法

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

總結

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

原文地址:https://mp.weixin.qq.com/s/tmC9UMkCx1eaO-kKElyTNg

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日韩欧美一区二区三区免费看 | 五月婷婷在线免费观看 | 国产第一福利 | 人人揉揉香蕉 | 精品在线免费观看视频 | 久9青青cao精品视频在线 | 菠萝视频在线完整版 | 国产高清国内精品福利 | 亚洲精品一二三四 | 日日摸夜夜爽色婷婷91 | 久久机热视频 这里只有精品首页 | 2022色婷婷综合久久久 | 成人免费在线视频观看 | 国产日产精品久久久久快鸭 | 亚洲成人综合在线 | 成人女人天堂午夜视频 | 亚洲 在线 日韩 欧美 | 亚洲麻豆精品果冻传媒 | 2023毛片| 无人区1在线观看 | 国产成人一区二区三区在线视频 | 久草在线精彩免费视频 | caoporen在线视频入口 | 国产福利片在线 | 国产午夜亚洲精品一区网站 | 白丝爆动漫羞羞动漫软件 | 免费精品99久久国产综合精品 | 国产区香蕉精品系列在线观看不卡 | 公交车揉捏大乳呻吟喘娇 | 大伊香蕉精品二区视频在线 | 狠狠的撞进去嗯啊h女强男视频 | 色综合视频在线观看 | 欧洲一级黑寡妇 | 日产精品一卡2卡三卡4乱码久久 | 久久精品亚洲国产AV涩情 | 日本高清视频在线的 | 亚洲日韩男人网在线 | 亚洲第一男人网站 | a亚洲天堂 | 免费真实播放国产乱子伦 | 91天堂视频 |