码迷,mamicode.com
首页 > 数据库 > 详细

TSql Merge On子句和When子句理解

时间:2015-12-09 19:07:47      阅读:192      评论:0      收藏:0      [点我收藏+]

标签:

Merge 的On子句指定Match condition,When子句指定过滤条件,如果Source Table和Targe Table匹配的上,很好理解;如果匹配不上,必须深入理解不匹配的条件,否则,就很容易出错。

 

1,创建示例数据

create table dbo.dt_source
(
    ID int,
    Code int
)
go

create table dbo.dt_target
(
    ID int,
    Code int
)
go


insert into dbo.dt_source
(
ID,
Code
)
values(1,1),(2,1),(3,2),(4,2),(5,0)
GO


insert into dbo.dt_target
(
ID,
Code
)
values(1,1),(6,4)
GO

2,在Merge的On子句中,使用额外的筛选条件(s.Code>0)对SourceTable进行过滤。这样做的初衷是将SourceTable中Code>0的数据作为数据源同步到TargetTable,但是,在Merge的On子句中,s.Code>0只是一个Match condition;

not matched子句是指不满足 t.id=s.id and s.ID>0 ,逻辑结果是: t.id<>s.id or s.ID<=0,这样dbo.dt_source中ID<=0的满足 not matched语义,所以会被插入到dbo.dt_target中。

;merge dbo.dt_target as t
using dbo.dt_source as s
    on t.id=s.id and s.Code>0
when matched
then update
set t.code=s.code
when not matched
then insert
(
ID,
Code
)
values
(
s.ID,
s.Code
);

查看TargetTable,Code=0的数据被插入到TargeTable表中,数据如下:

技术分享

 

在使用Merge 子句同步数据时, SourceTable的筛选条件要放在When子句中,如果不在When子句中添加SourceTable的过滤条件,那么就是同步整个SourceTable。

;merge dbo.dt_target as t
using dbo.dt_source as s
    on t.id=s.id 
when matched and s.Code>0 then update set t.code=s.code when not matched and s.Code>0 then insert ( ID, Code ) values ( s.ID, s.Code );

 

TSql Merge On子句和When子句理解

标签:

原文地址:http://www.cnblogs.com/ljhdo/p/5033612.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!