SQL Server 中Merge 的使用

很多人都知道ORACLE中有Merge关键字,其实SQL Server从2008版本开始也支持Merge了。

从而也可以像ORACLE一样在一条SQL语句中同时进行Update、Insert、Delete操作。

下面来一个简单的例子,直接上代码了,

数据准备:

IF OBJECT_ID('TestA','U') IS NOT NULL
	DROP TABLE TestA
GO

IF OBJECT_ID('TestB','U') IS NOT NULL
	DROP TABLE TestB
GO

CREATE TABLE TestA(ID INT,Title NVARCHAR(200))
GO

CREATE TABLE TestB(ID INT,Title NVARCHAR(200))
GO

INSERT INTO TestA(ID,Title) VALUES (1,N'A'),(2,N'B'),(3,N'C'),(4,N'D'),(5,N'E')
GO

INSERT INTO TestB(ID,Title) VALUES (1,N'一'),(3,N'三'),(5,N'五'),(7,N'七'),(9,N'九')
GO

现在的需求是,用TestB去更新TestA,ID相同的Update,ID不同的进行Insert

常规的实现方法是分两步走:

UPDATE a
SET a.Title = b.Title
FROM TestA a
INNER JOIN TestB b ON a.ID = b.ID;

INSERT INTO TestA(ID,Title)
SELECT a.ID,a.Title
FROM TestB a
WHERE NOT EXISTS(SELECT * FROM TestA WHERE ID = a.ID);

有了Merge,则可以一句话搞定,而且效率还很高:

MERGE INTO TestA AS a
USING TestB AS b
ON (a.ID = b.ID)
WHEN MATCHED
	THEN UPDATE SET a.Title = b.Title
WHEN NOT MATCHED BY TARGET
	THEN INSERT(ID,Title) VALUES(b.ID,b.Title);