【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
浙公网安备 33010602011771号