博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQL Server中的Merge关键字
阅读量:4560 次
发布时间:2019-06-08

本文共 2034 字,大约阅读时间需要 6 分钟。

简介

    Merge关键字是一个神奇的DML关键字。它在SQL Server 2008被引入,它能将Insert,Update,Delete简单的并为一句。MSDN对于Merge的解释非常的短小精悍:”根据与源表联接的结果,对目标表执行插入、更新或删除操作。例如,根据在另一个表中找到的差异在一个表中插入、更新或删除行,可以对两个表进行同步。”,通过这个描述,我们可以看出Merge是关于对于两个表之间的数据进行操作的。

    可以想象出,需要使用Merge的场景比如:

  •     数据同步
  •     数据转换
  •     基于源表对目标表做Insert,Update,Delete操作

 

使用Merge关键字的好处

    首先是更加短小精悍的语句,在SQL Server 2008之前没有Merge的时代,基于源表对目标表进行操作需要分别写好几条Insert,Update,Delete。而使用Merge,仅仅需要使用一条语句就好。下面我们来看一个例子。

    首先建立源表和目标表,并插入相关的数据,如下代码所示。

创建测试表并插入测试数据

--创建源表CREATE TABLE SourceTable(id INT,[DESC] varchar(50))--创建目标表CREATE TABLE TargetTable(id INT,[DESC] varchar(50))--为源表插入数据INSERT INTO dbo.SourceTable(id,[DESC]) values(1,'描述1')INSERT INTO dbo.SourceTable(id,[DESC]) values(2,'描述2')INSERT INTO dbo.SourceTable(id,[DESC]) values(3,'描述3')INSERT INTO dbo.SourceTable(id,[DESC]) values(4,'描述4')--为目标表插入数据INSERT INTO dbo.TargetTable(id,[DESC]) values(1,'在源表里存在,将会被更新')INSERT INTO dbo.TargetTable(id,[DESC]) values(2,'在源表里存在,将会被更新')INSERT INTO dbo.TargetTable(id,[DESC]) values(5,'在源表里不存在,将会被删除')INSERT INTO dbo.TargetTable(id,[DESC]) values(6,'在源表里不存在,将会被删除')go

 下面我们来写一个简单的Merge语句,如下代码所示。

一个简单的Merge语句:

MERGE INTO TargetTable AS TUSING SourceTable AS SON T.id=S.idWHEN MATCHED --当上面on后面的T.id=S.id时,目标表中的id为1,2的数据被更新THEN UPDATE SET T.[DESC]=S.[DESC]WHEN NOT MATCHED --目标表中没有ID,在源表中有,则插入相关数据THEN INSERT VALUES(S.id,S.[DESC])WHEN NOT MATCHED BY SOURCE --目标表中存在,源表中不存在,则删除THEN DELETE;

所造成的结果如下图所示。

Merge语句对于目标表的更新

 最终目标表的结果如下图所示。

最后目标表的结果

Merge语句还有一个强大的功能是通过OUTPUT子句,可以将刚刚做过变动的数据进行输出。我们在上面的Merge语句后加入OUTPUT子句,如下图所示。

Merge语句后加上OUTPUT子句

 此时Merge操作完成后,将所变动的语句进行输出,如图6所示。

输出Merge操作产生的数据变更

 当然了,上面的Merge关键字后面使用了多个WHEN…THEN语句,而这个语句是可选的.也可以仅仅新增或是仅仅删除,如下图所示。

仅仅插入的Merge语句

我们还可以使用TOP关键字限制目标表被操作的行,如下图所示。在第二段代码的语句基础上加上了TOP关键字,我们看到只有两行被更新。

使用TOP关键字的Merge语句

  但仅仅是MATCHED这种限制条件往往不能满足实际需求,我们可以在图7那个语句的基础上加上AND附加上额外的限制条件,如下图所示。

加上了AND限制条件的Merge语句

Merge关键字的一些限制

  •     使用Merge关键字只能更新一个表
  •     源表中不能有重复的记录

 

小结

    本文简单说明了Merge关键的字的使用。如果你使用的是SQL Server 2008之后的版本,在面对一些比如库存结账之类的业务时,放弃IF…ELSE和手写UPDATE,Insert吧,使用Merge关键字可以使这类操作更加轻松愉悦。

转载于:https://www.cnblogs.com/shuilangyizu/p/6832372.html

你可能感兴趣的文章
如何在Delphi XE2中使用Dynamic Web TWAIN
查看>>
js自定义实用函数总结
查看>>
java内存区域与内存溢出异常
查看>>
点点滴滴的成长[2011-11-1]:理解C#修饰符
查看>>
csrf(跨站请求伪造)
查看>>
高性能MySQL笔记-第1章MySQL Architecture and History-001
查看>>
在ubuntu下如何验证文件的MD5码 (转载)
查看>>
嵌入式Linux开发板
查看>>
通过创建制定版本react-native项目解决“Unable to resolve module `AccessibilityInfo` ”的问题...
查看>>
[BZOJ2730][HNOI2012]矿场搭建 点双 割点
查看>>
Linux/Mac 挂载远程服务器目录到本地
查看>>
1,实现在线答题 2,答题结束后可以判断对错 3,并将错题的结果保存起来。...
查看>>
JS中原始值和引用值的储存方式
查看>>
初学C#的简单编程题合集(更新)
查看>>
Linux学习闲谈(一)——Shell基本操作与命令
查看>>
写日志文件
查看>>
jvm 学习 二
查看>>
Date的格式转换
查看>>
RAC中SID,instance_number,thread#,undotbs之间的关系
查看>>
python的常用库及文档使用
查看>>