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

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 qq显示不了头像和图片怎么办 关于学校随便更换老师家长怎么办 qq群昵称改不了怎么办 电脑qq群视频进不去怎么办 微信头像没保存怎么办 qq群信息不响怎么办 微信封面换不了怎么办 微信头像没有了怎么办 科二超过5次怎么办 蘑菇街个人中心打不开怎么办 蘑菇街的个人中心打不开怎么办 qq群500人满了怎么办 微信零钱发不出来怎么办 微信零钱发不出去怎么办 微信零钱发不了红包怎么办 当亲戚孤立你该怎么办 陌陌好友找不到了怎么办 换了手机号陌陌号找不到怎么办 微信解析包出现问题怎么办 老板找借口不发工资怎么办 苹果手机忘记id帐号密码怎么办 苹果6手机帐号密码忘记怎么办 狗狗在窝里撒尿怎么办 爸妈和媳妇不好怎么办 如果老婆不用老公的钱怎么办 老公不给老婆钱花怎么办 奶少孩子不愿意吸怎么办 孩子识字少不愿意读书怎么办 夏天孩子不愿意喝水尿量少黄怎么办 孩子不喜欢与别人沟通怎么办 异地恋他爸妈不同意怎么办 刚装修家里很臭怎么办 狗弄得家里很臭怎么办 抑郁症患者不愿意回家见家人怎么办 属猴的人养猫怎么办 对方电话拉黑我怎么办 手机号码换了淘宝账号怎么办 扣扣号有密码无法加好友怎么办 扣扣帐号忘记了怎么办 扣扣帐号被冻结怎么办 xp忘了开机密码怎么办