<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          SQL中MERGE的用法

          共 2583字,需瀏覽 6分鐘

           ·

          2021-08-19 23:33

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

          設為“置頂或星標”,第一時間送達干貨

          SQL專欄

          SQL基礎知識第二版
          SQL高級知識第二版

          MERGE的定義

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


          MERGE的語法

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

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


          MERGE的用法

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

          當源表和目標表不匹配時:

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

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

          當源表和目標表匹配時:

          • 進行更新操作或者刪除操作


          MERGE的使用場景

          • 數(shù)據(jù)同步

          • 數(shù)據(jù)轉(zhuǎn)換

          • 基于源表對目標表做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:當Customers表里的客戶有購買商品,我們就更新一下他們的下單時間,將他們的下單時間往后推遲一小時,如果客戶沒有購買商品,那么我們就將這些客戶的信息插入到訂單表里。

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

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

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

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

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


          OUTPUT子句

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

          MERGE INTO Orders O
          --確定目標表Orders
          USING Customers C ON C.客戶ID=O.客戶ID
          --從源表Customers確定關聯(lián)條件 C.客戶ID=O.客戶ID
          WHEN MATCHED 
          --當匹配時對目標表的訂單日期執(zhí)行更新操作
          THEN UPDATE SET O.訂單日期=DATEADD(HOUR,1,O.訂單日期)
          WHEN NOT MATCHED BY TARGET
          --當不匹配時對目標表進行插入操作
          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í)行上述語句結果如下:

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


          總結

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


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

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


          后臺回復關鍵字:1024,獲取一份精心整理的技術干貨

          后臺回復關鍵字:進群,帶你進入高手如云的交流群。


          推薦閱讀
          瀏覽 25
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日韩另类色图 | 91调教视频 | 色拍拍综合网 | 小黄片在线看 | 偷拍色区图 |