SQL之merge into(转)

 

简介

    Merge关键字是一个神奇的DML关键字。它在SQL Server 2008被引入,它能将Insert,Update,Delete简单的并为一句。

  基于源表和目标表的差异,对目标表插入,更新,删除。

   merge into 目标表 as t

using 源表 as s

on 条件

when matched then update set t.column=s.column          --------目标表和源表都有

when not matched then  insert into values(....)           ---------目标表没有,但是源表有

when not matched by source then delete;                      ---------------源表没有,目标表有

 

 

使用Merge关键字的好处

    首先是更加短小精悍的语句,在SQL Server 2008之前没有Merge的时代,基于源表对目标表进行操作需要分别写好几条Insert,Update,Delete。而使用Merge,仅仅需要使用一条语句就好。下面我们来看一个例子。

    首先建立源表和目标表,并插入相关的数据,如图1所示。

  1

     图1.创建测试表并插入测试数据

   

    下面我们来写一个简单的Merge语句,如图2所示。

     2

     图2.一个简单的Merge语句

  

     所造成的结果如图3所示。

     3

     图3.Merge语句对于目标表的更新

 

     最终目标表的结果如图4所示。

     4

     图4.最后目标表的结果

 

    Merge语句还有一个强大的功能是通过OUTPUT子句,可以将刚刚做过变动的数据进行输出。我们在上面的Merge语句后加入OUTPUT子句,如图5所示。

    5

    图5.Merge语句后加上OUTPUT子句

 

   此时Merge操作完成后,将所变动的语句进行输出,如图6所示。

   6

   图6.输出Merge操作产生的数据变更

 

   当然了,上面的Merge关键字后面使用了多个WHEN…THEN语句,而这个语句是可选的.也可以仅仅新增或是仅仅删除,如图7所示。

   7

    图7.仅仅插入的Merge语句

 

   我们还可以使用TOP关键字限制目标表被操作的行,如图8所示。在图2的语句基础上加上了TOP关键字,我们看到只有两行被更新。

   8

    图8.使用TOP关键字的Merge语句

 

    但仅仅是MATCHED这种限制条件往往不能满足实际需求,我们可以在图7那个语句的基础上加上AND附加上额外的限制条件,如图9所示。

    9

    图9.加上了AND限制条件的Merge语句

 

Merge关键字的一些限制

  •     使用Merge关键字只能更新一个表
  •     源表中不能有重复的记录