【sql】使用 MERGE 插入、更新和删除数据

官网地址: 使用 MERGE 插入、更新和删除数据

使用 MERGE 语句执行以下操作:

  • 有条件地在目标表中插入或更新行。

    如果目标表中存在相应行,则更新一个或多个列;否则,会将数据插入新行。

  • 同步两个表。

    根据与源数据的差别在目标表中插入、更新或删除行。

MERGE 语法包括五个主要子句:

  • MERGE 子句用于指定作为插入、更新或删除操作目标的表或视图。

  • USING 子句用于指定要与目标联接的数据源。

  • ON 子句用于指定决定目标与源的匹配位置的联接条件。

  • WHEN 子句(WHEN MATCHED、WHEN NOT MATCHED BY TARGET 和 WHEN NOT MATCHED BY SOURCE)基于 ON 子句的结果和在 WHEN 子句中指定的任何其他搜索条件指定所要采取的操作。

  • OUTPUT 子句针对插入、更新或删除的目标中的每一行返回一行。

源中的行基于在 ON 子句中指定的联接谓词与目标中的行进行匹配。结果是合并后的输入流。对于每个输入行,会执行一个插入、更新或删除操作。根据在语句中指定的 WHEN 子句,输入行可能是以下内容之一:

  • 由来自目标的一个行和来自源的一个行组成的一个匹配对。这是 WHEN MATCHED 子句的结果。

  • 来自源的一个行,在目标中没有与之对应的行。这是 WHEN NOT MATCHED BY TARGET 子句的结果。

  • 来自目标的一个行,在源中没有与之对应的行。这是 WHEN NOT MATCHED BY SOURCE 子句的结果。

--    MERGE INTO - 数据的目的地,将数据最终 MERGE 到的表对象
--    USING 与源表连接 ON 关联的条件
--    WHEN MATCHED - 如果匹配成功,即关联条件成功 (这时就应该将 SOURCE 中其它的所有字段值更新到 TARGET 表中)
--    WHEN NOTMATCHED BY TARGET - 如果匹配不成功 (TARGET 中没有这一条记录但是 SOURCE 表有,说明 SOURCE 表多了新数据因此应该插入到 TARGET 表中)
--    WHEN NOTMATCHED BY SOURCE - 如果匹配不成功 (SOURCE 中没有这一条记录但是 TARGET 表有,说明 SOURCE 表可能把这条数据删除了,所以 TARGET 也应该删除)

-- MERGE statement with the join conditions specified correctly.
USE tempdb;
GO
BEGIN TRAN;
MERGE Target AS T
USING Source AS S
ON (T.EmployeeID = S.EmployeeID) 
WHEN NOT MATCHED BY TARGET AND S.EmployeeName LIKE 'S%' 
    THEN INSERT(EmployeeID, EmployeeName) VALUES(S.EmployeeID, S.EmployeeName)
WHEN MATCHED 
    THEN UPDATE SET T.EmployeeName = S.EmployeeName
WHEN NOT MATCHED BY SOURCE AND T.EmployeeName LIKE 'S%'
    THEN DELETE 
OUTPUT $action, inserted.*, deleted.*;
ROLLBACK TRAN;
GO 

 

posted @ 2017-06-08 10:51  FH1004322  阅读(1928)  评论(0)    收藏  举报