MS SQL2008下的Merge新语法
来源:互联网 发布:淘宝客推广视频 编辑:程序博客网 时间:2024/05/30 05:24
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 dUSING 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字段表名该是行插入,删除还是更新。
- MS SQL2008下的Merge新语法
- MS SQL2008下的Merge新语法
- SQL2008中Merge的用法
- SQL2008中Merge的用法
- 用SQL2008的MERGE语句同步表
- 用SQL2008的MERGE语句同步表
- SQL2008同Oracle的Merge用法比较
- 试试MS SQL2008的JDBC4的驱动方式
- win7上ms SQL2008的安装与卸载
- SQL2008中merge用法
- 新安装的SQL2008 无法登陆
- JSP连接MS sql2008设置
- Oracle9i之后的MERGE语法
- merge...into 语法的使用
- Oracle的Merge into语法
- merge into delete的语法
- SQL2008中的MERGE使用心得
- SQL2008新特性
- [转]gridview获取当前行索引的方法
- Animal.java
- The Cardigans - Please Sister
- Struts,MVC 的一种开放源码实现
- 如何求两个数组的交集
- MS SQL2008下的Merge新语法
- .NET 2.0 - WinForm Control - DataGridView 编程36计(一)
- 中国省份与城市数据库插入
- 关于Gridview中使用控件和图片导出到Excel的处理
- .NET 2.0 - WinForm Control - DataGridView 编程36计(二)
- 现金流
- 收集那些一生难忘的记忆片段
- ajax url中文乱码处理
- 一句话