1. SQL中MERGE的用法

        共 2583字,需瀏覽 6分鐘

         ·

        2021-08-19 23:33

        點(diǎn)擊關(guān)注上方“SQL數(shù)據(jù)庫開發(fā)”,

        設(shè)為“置頂或星標(biāo)”,第一時間送達(dá)干貨

        SQL專欄

        SQL基礎(chǔ)知識第二版
        SQL高級知識第二版

        MERGE的定義

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


        MERGE的語法

        MERGE INTO target_table
        USING source_table
        ON condition
        WHEN MATCHED THEN 
        operation
        WHEN NOT MATCHED THEN 
        operation;

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


        MERGE的用法

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

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

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

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

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

        • 進(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 語句。

        • 一個 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示例

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

        Customers

        Orders

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

        根據(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)匹配時對目標(biāo)表的訂單日期執(zhí)行更新操作
        THEN UPDATE SET O.訂單日期=DATEADD(HOUR,1,O.訂單日期)
        WHEN NOT MATCHED BY TARGET
        --當(dāng)不匹配時對目標(biāo)表進(jìn)行插入操作
        THEN INSERT (客戶ID,員工ID,訂單日期,發(fā)貨ID)
        VALUES (C.客戶ID,NULL,NULL,NULL)
        ;

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

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

        我們發(fā)現(xiàn)與Customers表里匹配上的訂單日期被修改了,訂單日期往后推遲了一小時,而沒有匹配上的在訂單表尾部增加了幾行記錄。這就是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)匹配時對目標(biāo)表的訂單日期執(zhí)行更新操作
        THEN UPDATE SET O.訂單日期=DATEADD(HOUR,1,O.訂單日期)
        WHEN NOT MATCHED BY TARGET
        --當(dāng)不匹配時對目標(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,插入也屬于更新,此外我們看到訂單日期又往后推遲了一小時,是因?yàn)槲覀冇忠淮螆?zhí)行了往后增加一小時的更新操作,其他的字段沒變。


        總結(jié)

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


        最后給大家分享我寫的SQL兩件套:《SQL基礎(chǔ)知識第二版》《SQL高級知識第二版》的PDF電子版。里面有各個語法的解釋、大量的實(shí)例講解和批注等等,非常通俗易懂,方便大家跟著一起來實(shí)操。

        有需要的讀者可以下載學(xué)習(xí),在下面的公眾號「數(shù)據(jù)前線」(非本號)后臺回復(fù)關(guān)鍵字:SQL,就行
        數(shù)據(jù)前線


        后臺回復(fù)關(guān)鍵字:1024,獲取一份精心整理的技術(shù)干貨

        后臺回復(fù)關(guān)鍵字:進(jìn)群,帶你進(jìn)入高手如云的交流群。


        推薦閱讀
        瀏覽 25
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評論
        圖片
        表情
        推薦
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
          
          

            1. 国产香蕉97碰碰碰视频 | 一级艳片加勒比女海盗1 | 婷婷色网| 操逼大片免费看 | 国产无码精品合集 |