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 );
时间: 2024-11-04 13:48:10