本文转载地址:http://www.cnblogs.com/CareySon/archive/2012/03/07/2383690.html

简介

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

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

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

使用Merge关键字的好处

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

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

图1.创建测试表并插入测试数据

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

图2.一个简单的Merge语句

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

图3.Merge语句对于目标表的更新

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

图4.最后目标表的结果

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

图5.Merge语句后加上OUTPUT子句

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

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

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

图7.仅仅插入的Merge语句

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

图8.使用TOP关键字的Merge语句

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

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

Merge关键字的一些限制

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

小结

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

最新文章

  1. Go - 字典(map)
  2. 关于AngularJs,数据绑定与自定义验证
  3. MyBaits一对一的查询方法
  4. pyhon之对memcached及redis操作
  5. Linux下通过NFS共享文件夹
  6. WebService之基于REST机制的实现实例(Java版)
  7. jar包程序 读取properties文件
  8. page61-将二分查找重写为一段面向对象的程序
  9. 李洪强iOS开发Swift篇—06_流程控制
  10. GoEasy实现web实时推送过程中的自动补发功能
  11. chrom 快捷键 整理版
  12. sql中常见日期获取
  13. Eureka配置instanceId显示IP
  14. WPF中触发器Trigger、MultiTrigger、DataTrigger、MultiDataTrigger、EventTrigger几种
  15. AMD/CMD/CommonJs到底是什么?它们有什么区别?
  16. 洛谷P1742 最小圆覆盖(计算几何)
  17. Bipartite Segments CodeForces - 901C (区间二分图计数)
  18. ASP.NET MVC3-Music Store中英文教程 [下载]
  19. 比较@Resource、@Autowired
  20. Buffer flip()方法

热门文章

  1. R自动数据收集第一章概述——《List of World Heritage in Danger》
  2. linux下如何关闭防火墙?如何查看防火墙当前的状态
  3. Hive metastore三种配置方式
  4. Dom4J解析技术
  5. [Storm] No data flows into bolt
  6. Python中的if __name__='__main__'语句的作用
  7. acm小知识
  8. 第3月第19天 cxx_destruct dispatch_get_main_queue()死锁
  9. Flash跨域传输数据 crossdomain.xml
  10. python 2.7 学习笔记--文件的基本操作