设为首页 加入收藏

TOP

SQL点滴18―SqlServer中的merge操作,相当地风骚(二)
2014-11-24 02:47:24 来源: 作者: 【 】 浏览:2
Tags:SQL点滴 SqlServer merge 操作 当地 风骚
rge对目标表执行update和insert操作

这次我们已知有一些表数据,我们要和Sales.SalesReason这个表中的数据做对比,如果和SalesReason表中的Name字段匹配时就更新表中的ReasonType列,如果没有匹配项的时候就插入这一行新的数据。在这里是使用表值构造函数指定源表的多个行,使用表变量存储更新记录,注意表变量的使用范围。代码如下:

1 declare @SummaryOfChanges table(Change varchar(20))2 merge into Sales.SalesReason as target3 using(values(Recommendation,Other),(Review,Marketing),(Internet,Promotion)) as source([NewName],NewReasonType)4 on target.Name=source.[NewName]5 when matched then update set ReasonType=source.NewReasonType6 when not matched by target then insert(Name,ReasonType) values ([NewName],NewReasonType)7 output $action into @SummaryOfChanges;8 select Change,COUNT(*) as CountPerChange from @SummaryOfChanges group by Change执行完上面的语句之后我们得到下面的结果说明执行了2次插入,1次更新,如图4。那么是不是这样的 呢,我们查看Sales.SalesReason这个表发现原来已经有’Review’这一条数据了,对它执行了更新,剩下的’Recommendation’,’Internet’执行的是插入操作。如果再次执行上面的语句就会得到UPDATE 3这样的结果,因为已经存在这三条数据了所以都执行UPDATE。

图4

  

将merge执行的结果插入到另外一个表中

我们还可以将merge操作得到的结果写入到另外一个表中,如下的语句将更新的每条数据信息写入到一个新建的表Production.UpdatedInventory中,代码如下:

1 INSERT INTO Production.UpdatedInventory 2 SELECT ProductID, LocationID, NewQty, PreviousQty 3 FROM 4 ( MERGE Production.ProductInventory AS target 5 USING (SELECT ProductID, SUM(OrderQty) 6 FROM Sales.SalesOrderDetail AS sod 7 JOIN Sales.SalesOrderHeader AS soh 8 ON sod.SalesOrderID = soh.SalesOrderID 9 AND soh.OrderDate BETWEEN 20030701 AND 200307311

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇SNS网站数据库技术分析 下一篇oracle trigger (触发器)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: