SQL Server MERGE


Merge关键字是一个神奇的DML关键字。它在SQL Server 2008被引入,它能将Insert,Update,Delete简单的并为一句。MSDN对于Merge的解释非常的短小精悍:”根据与源表联接的结果,对目标表执行插入、更新或删除操作。例如,根据在另一个表中找到的差异在一个表中插入、更新或删除行,可以对两个表进行同步。”,通过这个描述,我们可以看出Merge是关于对于两个表之间的数据进行操作的。

可以想象出,需要使用Merge的场景比如:

  • 数据同步
  • 数据转换
  • 基于源表对目标表做Insert,Update,Delete操作

对于大量数据的更新操作建议使用此方式进行

一下为简单的一个测试:

-- 源表

CREATE TABLE test_from (id INT, val VARCHAR(20));

-- 目标表

CREATE TABLE test_to (id INT, val VARCHAR(20));

-- 插入源表

INSERT INTO test_from VALUES (1, 'A');

INSERT INTO test_from VALUES (2, 'B');

-- 合并 源表到目标表

MERGE test_to USING test_from

ON ( test_to.id = test_from.id )    -- 条件是 id 相同

WHEN MATCHED THEN UPDATE SET test_to.val = test_from.val   -- 匹配的时候,更新

WHEN NOT MATCHED THEN INSERT VALUES(test_from.id, test_from.val) -- 源表有,目标表没有,插入

WHEN NOT MATCHED BY SOURCE THEN DELETE; -- 目标表有,源表没有,目标表该数据删除.

-- 第一次检查 目标表数据.

SELECT * FROM test_to;

id          val

----------- --------------------

          1 A

          2 B


-- 更新源表

UPDATE test_from SET val = 'A2' WHERE id = 1;

-- 删除源表

DELETE FROM test_from WHERE id = 2;

-- 插入源表

INSERT INTO test_from VALUES (3, 'C');

-- 合并 源表到目标表

MERGE test_to USING test_from

ON ( test_to.id = test_from.id )    -- 条件是 id 相同

WHEN MATCHED THEN UPDATE SET test_to.val = test_from.val   -- 匹配的时候,更新

WHEN NOT MATCHED THEN INSERT VALUES(test_from.id, test_from.val) -- 源表有,目标表没有,插入

WHEN NOT MATCHED BY SOURCE THEN DELETE; -- 目标表有,源表没有,目标表该数据删除.

-- 再次检查 目标表数据.

SELECT * FROM test_to;

id          val

----------- --------------------

          1 A2

          3 C


以上例子 在 SQL Server 2008 Express 下测试通过。