【杂记--2008新特性Merge用法】

/*---------------

*问题描述:如何用一句SQL语句对表同时进行delete update 等操作

*解决方案:Merge语句(SQL 2008新语法)

------------------*/

---------------Merge简介----------------

/*

Merge语句的作用是根据与源表联接的结果,对目标表执行插入、更新或删除操作.

--主要作用是将另外一个表的数据合并到另外一个表中,被合并的表称为目标表,用来合并的表称为源表。

--这里的合并是广义的合并,包括插入,更新和删除操作。

*/

--格式(一般)

 MERGE tbname --目标表

 using ()--这个括号里可以是表,视图,行集函数,连接表,派生表等多种形式

 on XXXX --指定目标表与源表的连接条件

 when matched --如果ON条件匹配,更新

 then update set .....

 when matched --如果ON条件匹配,删除

 then delete

 when not matched then.....;--分号结束

 

--PS)当匹配时,用<merge_matched>指定进行的动作,可以指定更新或删除目标表中的数据。

--   2)当不匹配时,可以指定不匹配的动作。不匹配包括两种情况:

--     一是源表与目标表不同(默认的):允许的动作只能是插入;

--     二是目标表与源表不匹配的情况:目标表与源表不匹配,则可以选择更新或删除。

------------------------------------------------------------------------------------------------

讲了这么多规则看个例子

例子

create table T1(id int,value int)

create table T2(id int,value int)

insert T1 values(1,1)

insert T1 values(2,2)

insert T1 values(3,3)

insert T1 values(4,4)

insert T2 values(1,1)

insert T2 values(2,4)

go

Merge T2 AS TARGE 

using T1 as sourc

on targe.id=sourc.id

when matched then update set targe.value=sourc.value

when not matched then insert values(sourc.id,sourc.value)

output $action,inserted.id,inserted.value,deleted.value ;--1.这里可以使用Output.分号别忘记

--测试

select * from T2  

--drop table T1,T2

--这样就实现了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 --注意这里可以使用附加条件(d.Manager <> dd.Manager OR d.DeptName <> dd.DeptName 

   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 ---注意这里当是目标表与源表不匹配的情况要用BY SOURCE 指出

   DELETE 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值