SQL Server中的Merge關鍵字

weixin_34346099發表於2012-03-07

Merge簡介

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

    Merge的使用場景:

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

Merge關鍵字的一些限制

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

Merge使用示例

1.Merge示例

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

下面寫一個簡單的Merge示例
MERGE INTO T_B AS B
USING T_A AS A ON B.id=A.ID
WHEN MATCHED --當B.id=A.ID時,更新目標表
THEN UPDATE SET B.name=A.name,B.Remark='更新記錄'
WHEN NOT MATCHED --若目標表中不存在,則新源表記錄插入目標表
THEN INSERT(id,name,book,remark) VALUES(A.id,A.name,A.book,'從源表新增')
WHEN NOT MATCHED BY SOURCE --源表中不存在,目標表存在
THEN DELETE;
執行前記錄:

執行後B表記錄:

2.Output子句

 Merge語句還有一個強大的功能是通過OUTPUT子句,可以將剛剛做過變動的資料進行輸出。我們在上面的Merge語句後加入OUTPUT子句,如圖所示。
--Merge Output
MERGE INTO T_B AS B
USING T_A AS A ON B.id=A.ID
WHEN MATCHED --當B.id=A.ID時,更新目標表
THEN UPDATE SET B.name=A.name,B.Remark='更新記錄'
WHEN NOT MATCHED --若目標表中不存在,則新源表記錄插入目標表
THEN INSERT(id,name,book,remark) VALUES(A.id,A.name,A.book,'從源表新增')
WHEN NOT MATCHED BY SOURCE --源表中不存在,目標表存在
THEN DELETE
OUTPUT $ACTION AS [ACTION],Inserted.id AS 插入的ID,Inserted.name 插入的Name,
Deleted.id AS 刪除的ID,Deleted.name AS 刪除的Name;
輸出結果:

3.其它條件組合使用

3.1 TOP約束
我們還可以使用TOP關鍵字限制目標表被操作的行。在上例的語句基礎上加上了TOP關鍵字,我們看到只有指定行被執行。

3.2AND附加限制條件
注意:
1.不能有多個 MATCHED  和 Not  MATCHED,即使是加and 條件的也不行,只給有一次。
2.NOT MATCHED BY SOURCE  可以加條件出現多次,但不帶and 條件限制的NOT MATCHED BY SOURCE 必須出現在帶and 條件的後面。
SQL語句

輸出結果如下圖:
執行前源表與目標表記錄:
執行後目標表結果:


相關文章