现在的位置: 首页 > 综合 > 正文

MS SQL2008下的Merge新语法

2013年10月22日 ⁄ 综合 ⁄ 共 2478字 ⁄ 字号 评论关闭

1、简要介绍  
  Merge语句的作用是根据与源表联接的结果,对目标表执行插入、更新或删除操作。
主要作用是将另外一个表的数据合并到另外一个表中,被合并的表称为目标表,用来合并的表称为源表。这里的合并是广义的合并,包括插入,更新和删除操作。因此,可以用Merge语句完成对一个表的更新,插入和删除操作。
2、语法
  Merge语法主要包括:1)指定目标表2)指定源表3)指定匹配条件和进行的操作。同时,Merge语句可以利用2005后的CTE特性,也可以在相应的部分指定相应的选项和表提示。一个典型的Merge语法如下:
[ WITH <common_table_expression> [,...n ] ]
MERGE  
  [ TOP ( expression ) [ PERCENT ] ] 
  [ INTO ] target_table   [ [ AS ] table_alias
USING <table_source>  ON <merge_search_condition>
  [ WHEN MATCHED [ AND <clause_search_condition> ] 
     THEN <merge_matched> ]
  [ WHEN NOT MATCHED [ BY TARGET ] [ AND <clause_search_condition> ]
     THEN <merge_not_matched> ]    
  [ WHEN NOT MATCHED BY SOURCE [ AND <clause_search_condition> ]  
     THEN <merge_matched> ]
;
3、分析及解释
    Merge语句中,目标表可以是数据库中的表或视图。而源表可以是表,视图,行集函数,连接表,派生表等多种形式。用using子句指定进行合并的数据来源。用on来指定目标表与源表的连接条件。同时可以指定top子句合并部分内容。
   在指定了源表和目标表及连接条件后,可以设定合并的具体行为了。1)当匹配时,用<merge_matched>指定进行的动作,可以指定更新或删除目标表中的数据。
  更新: UPDATE SET columnname=columnValue,.... 设置的语法和update语句的Set语句语法类似。
 删除:delete 因为删除的条件已经指定了,此处只需要写上delete关键字就可以了。

  2)当不匹配时,可以指定不匹配的动作。不匹配包括两种情况,一是源表与目标表不同,二是目标表与源表不匹配的情况,默认源表与目标表不同,by target可以省略不写。源表与目标表不同,允许的动作只能是插入。而目标表与源表不匹配,则可以选择更新或删除。
  插入:insert (field1,...) values(value1,....)
   其形式与insert语句相似,只是少了into 表名部分。

4、示例:
  1)两个表结构相同,
create table test1
(id int,name varchar(20))
go
create table test2
(id int,name varchar(20))
go
insert into test1(id,name)
values(1,'boyi55'),(2,'51cto'),(3,'bbs'),(4,'fengjicai'),(5,'alis')
insert into test2(id,name)
values(1,'boyi'),(2,'51cto')

merge   test2 t --要更新的目标表
using test1 s --源表
on t.id=s.id --更新条件(即主键)
when matched --如果主键匹配,更新
then update set t.name=s.name
when not matched then insert values(id,name);--目标表未知主键,插入。此语句必须以分号结束

      2)以下代码使用 MERGE 语句将源表 dbo.Departments_delta 与目标表 dbo.Departments 进行比较。此比较的搜索条件在该语句的 ON 子句中定义。根据比较的结果,将执行以下操作。

  • 在表 Departments 中,在源表和目标表中都存在的部门都将使用新名称、新经理或这两者进行更新。如果没有变化,则不进行任何更新。这是通过 WHEN MATCHED THEN 子句完成的。
  • 在 Departments 中不存在但存在于 Departments_delta 中的所有部门,将插入到 Departments 中。这是通过 WHEN NOT MATCHED THEN 子句完成的。
  • 在 Departments_delta 中不存在但存在于 Departments 中的所有部门将从 Departments 中删除。这是通过 WHEN NOT MATCHED BY SOURCE THEN 子句完成的。

MERGE dbo.Departments AS d USING dbo.Departments_delta AS dd
    ON (d.DeptID = dd.DeptID)
WHEN MATCHED AND d.Manager <> dd.Manager OR d.DeptName <> dd.DeptName     THEN
   UPDATE SET d.Manager = dd.Manager, d.DeptName = dd.DeptName
 WHEN NOT MATCHED THEN
    INSERT (DeptID, DeptName, Manager)         VALUES (dd.DeptID, dd.DeptName, dd.Manager)
 WHEN NOT MATCHED BY SOURCE THEN
     DELETE
5、进一步说明:
 1)当指定匹配与不匹配的动作时,可以指定附加的条件,如示例2中匹配同时指定了额外的条件。
 2)通过指定额外条件,可以有多个匹配条件,MSSQL 2008的限制是只能指定两个匹配的动作,只有当第一个匹配和条件不满足的时候和可能执行第二个,因此,第一个匹配的条件必须指定额外的条件。

  3)另外,可以在语句最后指定output子句,将结果输出。$Action字段表名该是行插入,删除还是更新。

抱歉!评论已关闭.