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字段表名该是行插入,删除还是更新。