成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

SQL中MERGE的用法,你學(xué)會了嗎?

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

MERGE的定義

MERGE關(guān)鍵字是一個(gè)神奇的DML關(guān)鍵字,它能將INSERT,UPDATE,DELETE等操作并為一句,根據(jù)與源表聯(lián)接的結(jié)果,對目標(biāo)表執(zhí)行插入、更新或刪除操作。

MERGE的語法

MERGE INTO target_tableUSING source_tableON conditionWHEN MATCHED THEN operationWHEN NOT MATCHED THEN operation;

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

MERGE的用法

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

當(dāng)源表和目標(biāo)表不匹配時(shí):

  • 若數(shù)據(jù)是源表有目標(biāo)表沒有,則進(jìn)行插入操作;
  • 若數(shù)據(jù)是源表沒有而目標(biāo)表有,則進(jìn)行更新或者刪除數(shù)據(jù)操作

當(dāng)源表和目標(biāo)表匹配時(shí):

  • 進(jìn)行更新操作或者刪除操作

MERGE的使用場景

  • 數(shù)據(jù)同步
  • 數(shù)據(jù)轉(zhuǎn)換
  • 基于源表對目標(biāo)表做INSERT,UPDATE,DELETE操作

我們常用的是第三種場景

MERGE使用限制

  • 在 MERGE MATCHED 操作中,只能允許執(zhí)行 UPDATE 或者 DELETE 語句。
  • 在 MERGE NOT MATCHED 操作中,只允許執(zhí)行 INSERT 語句。
  • 一個(gè) MERGE語句中出現(xiàn)的MATCHED操作,只能出現(xiàn)一次 UPDATE 或者 DELETE 語句,否則就會出現(xiàn)下面的錯誤: An action of type 'WHEN MATCHED' cannot appear more than once in a 'UPDATE' clause of a MERGE statement.

MERGE示例

下面我們通過一個(gè)示例來介紹一下該如何使用MERGE,我們以Customers表和Orders表為例。數(shù)據(jù)如下:

CustomersCustomers

OrdersOrders

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

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

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

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

我們看一下Orders表里的結(jié)果:

圖片圖片

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

OUTPUT子句

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

MERGE INTO Orders O
--確定目標(biāo)表Orders
USING Customers C ON C.客戶ID=O.客戶ID
--從源表Customers確定關(guān)聯(lián)條件 C.客戶ID=O.客戶ID
WHEN MATCHED 
--當(dāng)匹配時(shí)對目標(biāo)表的訂單日期執(zhí)行更新操作
THEN UPDATE SET O.訂單日期=DATEADD(HOUR,1,O.訂單日期)
WHEN NOT MATCHED BY TARGET
--當(dāng)不匹配時(shí)對目標(biāo)表進(jìn)行插入操作
THEN INSERT (客戶ID,員工ID,訂單日期,發(fā)貨ID)
VALUES (C.客戶ID,NULL,NULL,NULL)
OUTPUT $action AS [ACTION],Inserted.訂單日期 ,
Inserted.客戶ID,Inserted.發(fā)貨ID,Inserted.員工ID
--用OUTPUT輸出剛剛變動過的數(shù)據(jù)
;

執(zhí)行上述語句結(jié)果如下:

圖片圖片

從上圖我們看到,執(zhí)行的動作都是更新,這里的動作只有UPDATE和DELETE,插入也屬于更新,此外我們看到訂單日期又往后推遲了一小時(shí),是因?yàn)槲覀冇忠淮螆?zhí)行了往后增加一小時(shí)的更新操作,其他的字段沒變。

總結(jié)

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


責(zé)任編輯:武曉燕 來源: SQL數(shù)據(jù)庫開發(fā)
相關(guān)推薦

2022-07-13 08:16:49

RocketMQRPC日志

2022-12-06 08:37:43

2023-10-13 09:04:09

2023-06-05 08:36:04

SQL函數(shù)RANK()

2022-09-29 08:32:14

查詢語句OR

2024-06-12 08:36:25

2022-04-13 09:01:45

SASSCSS處理器

2023-08-08 08:23:08

Spring日志?線程池

2024-02-02 11:03:11

React數(shù)據(jù)Ref

2023-08-01 12:51:18

WebGPT機(jī)器學(xué)習(xí)模型

2024-01-02 12:05:26

Java并發(fā)編程

2023-12-27 09:32:47

SQL語句數(shù)據(jù)

2022-08-09 08:25:44

Stream創(chuàng)建流流計(jì)算

2020-02-27 14:05:26

SQLServer數(shù)據(jù)庫

2022-07-08 09:27:48

CSSIFC模型

2023-07-03 07:20:50

2024-01-19 08:25:38

死鎖Java通信

2024-02-04 00:00:00

Effect數(shù)據(jù)組件

2023-07-26 13:11:21

ChatGPT平臺工具

2023-01-10 08:43:15

定義DDD架構(gòu)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 国产精品久久久久一区二区三区 | 国产精品91久久久久久 | 国产精品av久久久久久久久久 | 一区二区三区视频在线 | 国产精品国产三级国产aⅴ无密码 | 久久精品一 | 天堂亚洲 | 草比av| 欧美日高清视频 | 久久免费视频网 | 日韩一区二区久久 | 国产一区二区久久 | 国产成人午夜电影网 | 人人做人人澡人人爽欧美 | 一区二区三区四区在线视频 | 国产激情综合五月久久 | 一区二区三区四区电影视频在线观看 | 欧美久久久久久 | 岛国av免费观看 | 狠狠久| 久久亚洲国产精品日日av夜夜 | 国产精品久久久久久238 | 久久狠狠 | 亚洲精品黄色 | 国产电影一区二区在线观看 | 中文字幕一区二区三区四区五区 | 青青草在线视频免费观看 | 久久综合伊人 | 精品成人av | 91视视频在线观看入口直接观看 | 精品一区二区在线视频 | 亚洲国产精品久久久久婷婷老年 | 亚洲欧美在线视频 | 久久精品国产一区二区电影 | 91.色| 我我色综合 | 成人在线视 | 欧美精品一区二区三区四区 在线 | 日韩一区和二区 | 久久国产欧美日韩精品 | 精品一二三区视频 |