MSSQL Server 2008中的MERGE(不仅仅是合并)
本篇文章由 泉州SEO www.234yp.com 整理发布,mssql www.234yp.com/Article/168194.html 谢谢合作!
mssql
就像标题呈现的一样,SQL Server 2008中的MERGE语句能做很多事情,它的功能是根据源表对目标表执行插入、更新或删除操作。最典型的应用就是进行两个表的同步。
下面通过一个简单示例来演示MERGE语句的使用方法,假设数据库中有两个表Product及ProductNew,我们的任务是将Product的数据同步到ProductNew(当然同步可能是每天通过Job来自动完成的,在此我们只关注MERGE的使用)。
以下SQL创建示例表:
--源表
CREATE TABLE Product
(
ProductID varchar(7) NOT NULL PRIMARY KEY,
ProductName varchar(100) NOT NULL,
Price decimal(13,2) DEFAULT 0
);
INSERT INTO Product
Values
('4100037','优盘',50),
('4100038','鼠标',30);
--目标表
CREATE TABLE ProductNew
(
ProductID varchar(7) NOT NULL PRIMARY KEY,
ProductName varchar(100) NOT NULL,
Price decimal(13,2) DEFAULT 0
);
下面再来关注MERGE语句的基本语法:
MERGE 目标表
USING 源表
ON 匹配条件
WHEN MATCHED THEN
语句
WHEN NOT MATCHED THEN
语句;
以上是MERGE的最最基本的语法,语句执行时根据匹配条件的结果,如果在目标表中找到匹配记录则执行WHEN MATCHED THEN后面的语句,如果没有找到匹配记录则执行WHEN NOT MATCHED THEN后面的语句。注意源表可以是表,也可以是一个子查询语句。
格外强调一点,MERGE语句最后的分号是不能省略的!
回到我们的示例,显然Product与ProductNew表的MERGE匹配条件为主键ProductID字段,初始情况下,ProductNew表为空,此时肯定执行的是WHEN NOT MATCHED THEN后的语句,我们先只考虑源表递增的情况,MERGE语句如下:
MERGE ProductNew AS d
USING
Product
AS s
ON s.ProductID = d.ProductId
WHEN NOT MATCHED THEN
INSERT( ProductID,ProductName,Price)
VALUES(s.ProductID,s.ProductName,s.Price);
运行后2行受影响,我们已经将Product表的数据同步到了ProductNew表。
现在,我们更新Product表4100037产品的价格,将其修改为55:
UPDATE Product SET Price=55 WHERE ProductID='4100037';
我们也希望每天同步的时候应该将更新后的价格同步到ProductNew表,显然此时在MERGE语句中应该添加WHEN MATCHED THEN 语句,该语句来更新ProductNew表的价格,添加匹配更新后的MERGE语句:
MERGE ProductNew AS d
USING
Product
AS s
ON s.ProductID = d.ProductId
WHEN NOT MATCHED THEN
INSERT( ProductID,ProductName,Price)
VALUES(s.ProductID,s.ProductName,s.Price)
WHEN MATCHED THEN
UPDATE SET d.ProductName = s.ProductName, d.Price = s.Price;
执行后2行受影响,为什么是两行呢?因为我们的匹配条件只是按ProductID来关联的,这样匹配出来的记录为2行。另外,我们的UPDATE语句里面没有更新ProductID字段,因为这是完全没必要的(如果修改了ProductID字段会直接走到NOT MATCHED)。
现在做个破坏,我们将410037产品删除掉:
DELETE Product WHERE ProductID='4100037';
明显,上面给出的MERGE语句无法同步这种情况,再次回到MERGE语句的定义,对MERGE的WHEN NOT MATCHED THEN语句稍作扩展:
WHEN NOT MATCHED BY TARGET
表示目标表不匹配,BY TARGET是默认的,所以上面我们直接使用WHEN NOT MATCHED THEN
WHEN NOT MATCHED BY SOURCE
表示源表不匹配,即目标表中存在,源表中不存在的情况。
现在我们要完成源表DELETE后,目标表的同步动作,MERGE语句如下:
MERGE ProductNew AS d
USING
Product
AS s
ON s.ProductID = d.ProductId
WHEN NOT MATCHED BY TARGET THEN
INSERT( ProductID,ProductName,Price)
VALUES(s.ProductID,s.ProductName,s.Price)
WHEN NOT MATCHED BY SOURCE THEN
DELETE
WHEN MATCHED THEN
UPDATE SET d.ProductName = s.ProductName, d.Price = s.Price;
上面已经使用到MERGE语句中的INSERT、UPDATE、DELETE语句,这足够完成大多数的同步功能了。当然,MERGE语句还有很多的选项,在此不做详述,请参考MSDN.
关于更多mssql内容,可以收藏本网页。
财牛网厦门权威财经网站,提供7X24小时财经资讯
MSSQL Server 2008中的MERGE(不仅仅是合并)相关推荐
- mysql中的merge into,SQL Server 2008中利用merge into关键实现insert/update自动匹配(类似于MySQL中的For Update关键字)...
SQL Server 2008中利用merge into关键实现insert/update自动匹配(类似于MySQL中的For Update关键字) 语法请参考: 按照语法编写语句 DECLARE @ ...
- Linux 下用 Python 连接 MSSql Server 2008
Linux 下用 Python 连接 MSSql Server 2008 赖勇浩(http://blog.csdn.net/lanphaday) Keywords:Linux.python.pyodb ...
- SQL Server 2008中SQL增强之三:Merge(在一条语句中使用Insert,Update,Delete)
SQL Server 2008中SQL增强之三:Merge(在一条语句中使用Insert,Update,Delete) SQL Server 2008提供了一个增强的SQL命令Merge,用法参看MS ...
- MSSQL Server 2008 功能
在 现今数据世界里,公司要获得成功和不断发展,他们需要定位主要数据趋势愿景.微软的数据平台愿景将帮助公司满足数据爆炸和下一代数据驱动应用程序的需求. 微软将继续投入和发展以下的关键领域来支持他们的数据 ...
- SQL Server 2008中新增的变更数据捕获(CDC)和更改跟踪
SQL Server 2008中新增的变更数据捕获(CDC)和更改跟踪 SQL Server 2008中SQL应用系列--目录索引 本文主要介绍SQL Server中记录数据变更的四个方法:触发器.O ...
- php sql server 安装教程,MSSQL Server 2008图文安装教程
MSSQL Server 2008图文安装教程 SQL Server 2008我们也能从中体验到很多新的特性,但是对于SQL Server 2008安装,还是用图来说话比较好.本文将从SQL Serv ...
- SQL Server 2008中SQL应用系列及BI学习笔记系列--目录索引 @邀月
邀月 的数据库学习 http://www.cnblogs.com/downmoon/archive/2011/03/10/1980172.html SQL Server 2008中SQL应用系列及BI ...
- SQL Server 2008中的Pivot和UnPivot
SQL Server 2008中SQL应用系列--目录索引 今天给新成员讲解PIVOT 和 UNPIVOT示例,顺便整理了一下其用法.这是自SQL Server 2005起提供的新功能. 官方示例:h ...
- 在 Windows Server 2008 中通过组策略向计算机或用户部署网络打印机
最先在 Windows Server 2003 R2 中发布的打印管理控制台 (PMC),在 Windows Server 2008 中得到了增强.Windows Server 2008 中的 PMC ...
最新文章
- 使用 Rx 中预定义的 Subject
- 从今天开始,学习Webpack,减少对脚手架的依赖(下)
- 计算机组成原理第7章-输入/输出系统
- method initializationerror not found:JUnit4单元测试报错问题
- 2019ICPC(南昌) - Magic Master(模拟)
- Java多线程之Semaphore用法
- pyinstaller打包执行exe出现“ModuleNotFoundError: No module named ‘scipy.spatial.transform._rotation_group”
- 基于jquery类库的绘制二维码的插件jquery.qrcode.js
- 1005打印任务取消不了 hp_惠普HP M1136 MFP多功能打印机 一年半使用感受(学生打印机)...
- android studio开发个人备忘录算法设计_Android Studio 4.1 发布,全方位提升开发体验...
- 防爆知识:危险场所划
- springboot2.x整合Email并利用AOP做一个项目异常通知功能
- 菜鸟程序员成长之路(七)——2020年,你奋斗了吗?
- APP推广要做哪些?渠道?方案?竞争分析?
- linux内核mproject函数,把linux驱动独立于内核外编译--示例
- 【优秀课设】基于Linux粤嵌GEC6818开发板的电子乐队程序设计(四种模式:和弦模式、键盘模式、鼓点模式、编曲模式)
- 前端-css美化网页元素(一)字体样式,文本样式
- G003-186-18
- 做跨境电商,用信用卡通道还是Paypal收款比较便宜?
- java8精简的jre,精简版jre,只有9M多哦!
热门文章
- 多通道LMMSE图像超分辨复原方法研究-附Matlab代码
- 丝印印唛颜色实在、立体感强
- c++求矩阵的秩_常见的矩阵分解
- 线性代数(9): 空间与维度
- 自动化恶意软件分析系统Cuckoo安装、配置详解
- 万年历农历程序(抄表法)
- JavaScript------JS相关难题,做对一半算你牛牪犇
- 论文笔记:An Adaptive Feature Norm Approach for Unsupervised Domain Adaptation
- vue项目中使用trackingjs人脸识别
- 着急使用新西兰无犯罪文件怎么办理新西兰使馆认证呢