T-SQL CROSS APPLY、MERGE

本文介绍SQL Server 2008中的两个新特性:CROSSAPPLY和MERGE。CROSSAPPLY简化了多表关联查询的操作,MERGE则用于实现数据表之间的同步,包括插入、更新和删除等操作。

写在前面

            刚才看项目里一个存储过程,也是好长时间没有使用Sql Server2008了,好多写法和函数感觉到陌生,这就遇到了CROSS APPLY 和MERGE的语法,两者之前完全没接触过。 所以专门查了下SQL Server2008实战。

 

1、CROSS APPLY

         从教程和数据查询结果来看CROSS APPLY完全是属于语法糖,下面是我基于AdventrueWorkR2查询的,使用了CROSS APPLY和INNER JOIN两种方式。

USE [AdventureWorks2008R2]
GO
/****** Object:  UserDefinedFunction [dbo].[fn_WorkOrderRouting]    Script Date: 08/13/2015 13:16:00 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[fn_WorkOrderRouting]
  (@WorkOrderID int) RETURNS TABLE
AS
RETURN 
 SELECT a.WorkOrderID,a.ProductID,a.OperationSequence,a.LocationID 
 FROM Production.WorkOrderRouting a 
 WHERE a.WorkOrderID=@WorkOrderID

  

select w.WorkOrderID,w.OrderQty,r.ProductID,r.OperationSequence 
from Production.WorkOrder w
CROSS APPLY dbo.fn_WorkOrderRouting(w.WorkOrderID) as r
ORDER BY w.WorkOrderID,w.OrderQty,r.ProductID

  

SELECT a.WorkOrderID,a.OrderQty,b.ProductID,b.OperationSequence FROM 
Production.WorkOrder a 
INNER JOIN Production.WorkOrderRouting b on a.WorkOrderID= b.WorkOrderID
ORDER BY a.WorkOrderID,a.OrderQty,b.ProductID

 

2、MERGE

     merge简单来说是针对插入、更新、删除三个操作的合并,根据与源表联结的结果,对目标表进行插入、更新、删除。 我们经常用的场景也就是主从表同步,或者是主表和历史表的同步和维护。 下面代码片段是我在网上看到的一段:

--创建一个临时的订单表
CREATE TABLE Orders(OrderID INT,CustomerID NCHAR(5))
 GO
--往这个表中添加两行记录
INSERT INTO Orders VALUES(1,N'AAAAA')
 INSERT INTO Orders VALUES(2,N'BBBBB')
 GO
--通过生成表查询,产生另外一个架构一模一样的表,但只是复制了第一行数据过去
SELECT * INTO Orders2 FROM Orders WHERE OrderID=1
 GO
--将第二个表的数据进行更新
UPDATE orders2 SET CustomerID=N'DDDDD'
--合并两个表
MERGE Orders o
 USING Orders2 o2 ON o2.OrderID=o.OrderID
 WHEN MATCHED THEN UPDATE SET O.CustomerID=o2.CustomerID--如果匹配到了,就更新掉目标表
 WHEN NOT MATCHED THEN INSERT VALUES(o2.OrderID,o2.CustomerID)--如果匹配不到,就插入
 WHEN NOT MATCHED BY SOURCE THEN DELETE;--如果来源表无法匹配到,就删除

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值