Merge 语法实例

浏览: 1728
--Merge 语法是对表进行插入,更新,删除这三个操作的合并。
--根据与源表联接的结果,对目标表执行插入、更新或删除操作。
--MERGE 语法包括如下五个主要子句:
--  MERGE 子句用于指定作为插入、更新或删除操作目标的表或视图。
--  USING 子句用于指定要与目标联接的数据源。
--  ON 子句用于指定决定目标与源的匹配位置的联接条件。
--  WHEN 子句用于根据ON 子句的结果指定要执行的操作。
--  OUTPUT 子句针对更新、插入或删除的目标对象中的每一行返回一行。
 
 
--示例:
 
USE tempdb
GO
--创建表A
IF NOT OBJECT_ID('[A]') IS NULL
    DROP TABLE [A]
GO
CREATE TABLE A(ID INT,ACOL VARCHAR(10))
GO
INSERT A VALUES(1,N'A')
INSERT A VALUES(2,N'B')
INSERT A VALUES(3,N'C')
INSERT A VALUES(6,N'X') --此记录在B表中不存在,删除
GO
--创建表B
IF NOT OBJECT_ID('[B]') IS NULL
    DROP TABLE [B]
GO
CREATE TABLE B(ID INT,BCOL VARCHAR(10),XCOL VARCHAR(10))
GO
INSERT B VALUES(1,N'A',N'T')  --1的ID与A表ID匹配且指定值与A表指定值对应相同,不变
INSERT B VALUES(2,N'P',N'O')  --2和的ID与A表ID匹配,指定值与A表指定值对应不同,更新
INSERT B VALUES(3,N'P',N'N')
INSERT B VALUES(4,N'L',N'Y')  --4和的ID与A表ID匹配,指定值在A表中对应不存在,插入
INSERT B VALUES(5,N'E',N'S')  
GO
--开始合并两个表:
MERGE A --要处理的表
USING B --参照的表
ON A.ID=B.ID --关联条件
WHEN NOT MATCHED THEN INSERT VALUES(B.ID,B.BCOL) --如果要处理表没有参照表上的记录,则插入
WHEN MATCHED THEN UPDATE SET A.ACOL=B.BCOL --如果记录匹配,就更新目标表的匹配行
WHEN NOT MATCHED BY SOURCE THEN DELETE --如果要处理表的记录在参照表上不存在,则删除
OUTPUT $action, Inserted.*, Deleted.*; --相当于输出以上语句的操作记录
 
/*--result:
$action    ID          ACOL       ID          ACOL
---------- ----------- ---------- ----------- ----------
INSERT     4           L          NULL        NULL
INSERT     5           E          NULL        NULL
UPDATE     1           A          1           A
UPDATE     2           P          2           B
UPDATE     3           P          3           C
DELETE     NULL        NULL       6           X
 
(6 行受影响)
*/
--看看A表更新成什么样:
SELECT * FROM A
/*
ID          ACOL
----------- ----------
1           A
2           P
3           P
4           L
5           E
 
(5 行受影响)
*/
--再变换一个字段
MERGE A --要处理的表
USING B --参照的表
ON A.ID=B.ID --关联条件
WHEN NOT MATCHED THEN INSERT VALUES(B.ID,B.XCOL) 
WHEN MATCHED THEN UPDATE SET A.ACOL=B.XCOL 
WHEN NOT MATCHED BY SOURCE THEN DELETE
OUTPUT $action, Inserted.*, Deleted.*;
 
/*--result:
$action    ID          ACOL       ID          ACOL
---------- ----------- ---------- ----------- ----------
UPDATE     1           T          1           A
UPDATE     2           O          2           P
UPDATE     3           N          3           P
UPDATE     4           Y          4           L
UPDATE     5           S          5           E
 
(5 行受影响)
*/
--再看看现在的A表像什么样
SELECT * FROM A
/*
ID          ACOL
----------- ----------
1           T
2           O
3           N
4           Y
5           S
 
(5 行受影响)
*/
推荐 0
本文由 TravyLee 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册