SQL Server中的Merge關鍵字

來源:互聯網
上載者:User

標籤:dml   通過   blog   images   div   output   bsp   刪除行   msdn   

簡介

    Merge關鍵字是一個神奇的DML關鍵字。它在SQL Server 2008被引入,它能將Insert,Update,Delete簡單的並為一句。MSDN對於Merge的解釋非常的短小精悍:”根據與源表聯結的結果,對目標表執行插入、更新或刪除操作。例如,根據在另一個表中找到的差異在一個表中插入、更新或刪除行,可以對兩個表進行同步。”,通過這個描述,我們可以看出Merge是關於對於兩個表之間的資料進行操作的。

    可以想象出,需要使用Merge的情境比如:

  •     資料同步
  •     資料轉換
  •     基於源表對目標表做Insert,Update,Delete操作

 

使用Merge關鍵字的好處

    首先是更加短小精悍的語句,在SQL Server 2008之前沒有Merge的時代,基於源表對目標表進行操作需要分別寫好幾條Insert,Update,Delete。而使用Merge,僅僅需要使用一條語句就好。下面我們來看一個例子。

    首先建立源表和目標表,並插入相關的資料,如下代碼所示。

建立測試表並插入測試資料

--建立源表CREATE TABLE SourceTable(id INT,[DESC] varchar(50))--建立目標表CREATE TABLE TargetTable(id INT,[DESC] varchar(50))--為源表插入資料INSERT INTO dbo.SourceTable(id,[DESC]) values(1,‘描述1‘)INSERT INTO dbo.SourceTable(id,[DESC]) values(2,‘描述2‘)INSERT INTO dbo.SourceTable(id,[DESC]) values(3,‘描述3‘)INSERT INTO dbo.SourceTable(id,[DESC]) values(4,‘描述4‘)--為目標表插入資料INSERT INTO dbo.TargetTable(id,[DESC]) values(1,‘在源表裡存在,將會被更新‘)INSERT INTO dbo.TargetTable(id,[DESC]) values(2,‘在源表裡存在,將會被更新‘)INSERT INTO dbo.TargetTable(id,[DESC]) values(5,‘在源表裡不存在,將會被刪除‘)INSERT INTO dbo.TargetTable(id,[DESC]) values(6,‘在源表裡不存在,將會被刪除‘)go

 下面我們來寫一個簡單的Merge語句,如下代碼所示。

一個簡單的Merge語句:

MERGE INTO TargetTable AS TUSING SourceTable AS SON T.id=S.idWHEN MATCHED --當上面on後面的T.id=S.id時,目標表中的id為1,2的資料被更新THEN UPDATE SET T.[DESC]=S.[DESC]WHEN NOT MATCHED --目標表中沒有ID,在源表中有,則插入相關資料THEN INSERT VALUES(S.id,S.[DESC])WHEN NOT MATCHED BY SOURCE --目標表中存在,源表中不存在,則刪除THEN DELETE;

所造成的結果如所示。

Merge語句對於目標表的更新

 最終目標表的結果如所示。

最後目標表的結果

Merge語句還有一個強大的功能是通過OUTPUT子句,可以將剛剛做過變動的資料進行輸出。我們在上面的Merge語句後加入OUTPUT子句,如所示。

Merge語句後加上OUTPUT子句

 此時Merge操作完成後,將所變動的語句進行輸出,6所示。

輸出Merge操作產生的資料變更

 當然了,上面的Merge關鍵字後面使用了多個WHEN…THEN語句,而這個語句是可選的.也可以僅僅新增或是僅僅刪除,如所示。

僅僅插入的Merge語句

我們還可以使用TOP關鍵字限制目標表被操作的行,如所示。在第二段代碼的語句基礎上加上了TOP關鍵字,我們看到只有兩行被更新。

使用TOP關鍵字的Merge語句

  但僅僅是MATCHED這種限制條件往往不能滿足實際需求,我們可以在圖7那個語句的基礎上加上AND附加上額外的限制條件,如所示。

加上了AND限制條件的Merge語句

Merge關鍵字的一些限制
  •     使用Merge關鍵字只能更新一個表
  •     源表中不能有重複的記錄

 

小結

    本文簡單說明了Merge關鍵的字的使用。如果你使用的是SQL Server 2008之後的版本,在面對一些比如庫存結賬之類的業務時,放棄IF…ELSE和手寫UPDATE,Insert吧,使用Merge關鍵字可以使這類操作更加輕鬆愉悅。

SQL Server中的Merge關鍵字

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.