Merge

/*Merge语法是对插入,更新,删除这三个操作的合并。
根据与源表联接的结果,对目标表执行插入、更新或删除操作。
例如,根据在另一个表中找到的差异在一个表中插入、更新或删除行,可以对两个表进行同步。

我这里用一个简单的例子来解释一下
*/

USE tempdb
GO
--创建一个临时的订单表
CREATE TABLE Orders(OrderID INT,CustomerID NCHAR(5))
GO
--往这个表中添加两行记录
INSERT INTO Orders VALUES(1,N'AAAAA')
INSERT INTO Orders VALUES(2,N'BBBBB')
GO
--通过生成表查询,产生另外一个架构一模一样的表,但只是复制了第一行数据过去
SELECT * INTO Orders2 FROM Orders WHERE OrderID=1
GO
select * from orders
select * from orders2
--将第二个表的数据进行更新
UPDATE orders2 SET CustomerID=N'DDDDD'

--合并两个表
MERGE Orders o
USING Orders2 o2 ON o2.OrderID=o.OrderID
WHEN MATCHED THEN UPDATE SET O.CustomerID=o2.CustomerID--如果匹配到了,就更新掉目标表
WHEN NOT MATCHED THEN INSERT VALUES(o2.OrderID,o2.CustomerID)--如果匹配不到,就插入
WHEN NOT MATCHED BY SOURCE THEN DELETE;--如果来源表无法匹配到,就删除


--创建并初始化源表
CREATE TABLE tbSource --创建源表和数据
(
C1 INT PRIMARY KEY,
C2 NVARCHAR(10)
)
GO
INSERT tbSource
VALUES(1,N'甲'),
(2,N'乙')
GO

--创建目标表和修改源表数据
SELECT * INTO tbTarget --创建目标表
FROM tbSource

--以下是对源表数据的修改
DELETE tbSource WHERE C1=1
UPDATE tbSource SET C2=N'乙2' WHERE C1=2
INSERT tbSource VALUES(3,N'丙')

select * from tbSource
select * from tbTarget

--使用Merge合并表
MERGE tbTarget t --合并源表和目标表
USING tbSource s
ON t.c1 = S.c1 --合并依据
WHEN MATCHED THEN --修改
UPDATE SET t.c2 = S.c2
WHEN NOT MATCHED THEN --新增
INSERT VALUES(c1, c2)
WHEN NOT MATCHED BY SOURCE THEN --刪除
DELETE
OUTPUT $action, INSERTED.c1 [New c1], --输出合并操作结果
INSERTED.c2 [New c2],
DELETED.c1 [Original c1],
DELETED.c2 [Original c2];

-

posted on 2016-09-01 14:22  netyaya  阅读(92)  评论(0)    收藏  举报

导航