TSql Merge On子句和When子句理解

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

TSql Merge On子句和When子句理解的相关文章

oracle中where 子句和having子句中的区别

1.where 不能放在GROUP BY 后面 2.HAVING 是跟GROUP BY 连在一起用的,放在GROUP BY 后面,此时的作用相当于WHERE 3.WHERE 后面的条件中不能有聚集函数,比如SUM(),AVG()等,而HAVING 可以 Where和Having都是对查询结果的一种筛选,说的书面点就是设定条件的语句.下面分别说明其用法和异同点.注:本文使用字段为oracle数据库中默认用户scott下面的emp表,sal代表员工工资,deptno代表部门编号.一.聚合函数   

where 子句和having子句中的区别

1.where 不能放在GROUP BY 后面 2.HAVING 是跟GROUP BY 连在一起用的,放在GROUP BY 后面,此时的作用相当于WHERE 3.WHERE 后面的条件中不能有聚集函数,比如SUM(),AVG()等,而HAVING 可以 Where和Having都是对查询结果的一种筛选,说的书面点就是设定条件的语句.下面分别说明其用法和异同点.注:本文使用字段为oracle数据库中默认用户scott下面的emp表,sal代表员工工资,deptno代表部门编号.一.聚合函数   

oracle中where子句和having子句中的区别

1.where  不能放在GROUP BY 后面2.HAVING 是跟GROUP BY 连在一起用的,放在GROUP BY 后面,此时的作用相当于WHERE3.WHERE  后面的条件中不能有聚集函数,比如SUM(),AVG()等,而HAVING 可以 Where和Having都是对查询结果的一种筛选,说的书面点就是设定条件的语句.下面分别说明其用法和异同点.注:使用字段为oracle数据库中默认用户scott下面的emp表,sal代表员工工资,deptno代表部门编号.一.聚合函数聚合函数有时

在oracle中where 子句和having子句中的区别

在oracle中where 子句和having子句中的区别 1.where 不能放在GROUP BY 后面 2.HAVING 是跟GROUP BY 连在一起用的,放在GROUP BY 后面,此时的作用相当于WHERE 3.WHERE 后面的条件中不能有聚集函数,比如SUM(),AVG()等,而HAVING 可以 Where和Having都是对查询结果的一种筛选,说的书面点就是设定条件的语句.下面分别说明其用法和异同点.注:本文使用字段为oracle数据库中默认用户scott下面的emp表,sal

Mysql ON子句和USING子句

Mysql ON子句和USING子句 Mysql 中联接SQL语句中,ON子句的语法格式为:table1.column_name = table2.column_name. 当模式设计对联接表的列采用了相同的命名样式时,就可以使用 USING 语法来简化 ON 语法,格式为:USING(column_name). 例如: [sql] SELECT f.color, c.is_primary, c.is_dark, c.is_rainbow FROM flags f    www.2cto.com

SQL语句中的Having子句与where子句

一.介绍 聚合函数如SUM, COUNT, MAX, AVG等.这些函数和其它函数的根本区别就是它们一般作用在多条记录上.而通过使用GROUP BY 子句,可以让SUM 和 COUNT 这些函数对属于一组的数据起作用.当你指定 GROUP BY region 时,只有属于同一个region的一组数 据才返回一个值. HAVING子句可以让我们筛选成组后的各组数据,WHERE子句在聚合前先筛选记录.也就是说作用在GROUP BY 子句和HAVING子句前 HAVING子句在聚合后对组记录进行筛选.

T-SQL查询:CTE - with as 子句的特殊应用

之前在2本书看到过with as 子句的一个简单例子,网上没找到相关资料. 今天想起总结一下,主要说明如下: [大表分批更新] [大表分批删除] [完全重复的行只保留一行] --创建测试表 -- DROP TABLE [tabName] SELECT * INTO [tabName] FROM sys.objects SELECT * FROM [databaseName].[dbo].[tabName] ORDER BY name desc --------------------------

TSQL Merge 用法

TSQL的Merge语句不仅能够同步数据,而且能够将更新的数据输出. 一,语法 1,when match子句要求Target表中一个数据行只能被更新一次 If UPDATE is specified in the <merge_matched> clause, and more than one row of <table_source>matches a row in target_table based on <merge_search_condition>, SQ

经过几天的研究,对于SVN的Merge有了更透彻的理解

多分支开发,Merge是一个绕不过的话题,不管是Git还是SVN,之前对于SVN的Merge没有很好的研究,出了些状况,这个问题不解决,顺畅地进行多分支开发就是海市蜃楼,下定决心把这块给完全搞透,在百度上找到的都是太古老的资料,SVN的帮助又没有写得太清楚,没有例子,最终在StackFlow上找到自己想要的.简单总结如下: 1.主干是一切的基石 2.任何分支的来源都必须是主干 3.如果主干修改不多,以分支修改为主的,就要从主干合并到分支(这一步最好是每天都做) 4.在需要建立一个新分支之前,一定