標籤:
寫在前面
剛才看項目裡一個預存程序,也是好長時間沒有使用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 ONGOSET QUOTED_IDENTIFIER ONGOALTER FUNCTION [dbo].[fn_WorkOrderRouting] (@WorkOrderID int) RETURNS TABLEASRETURN SELECT a.WorkOrderID,a.ProductID,a.OperationSequence,a.LocationID FROM Production.WorkOrderRouting a WHERE [email protected]
select w.WorkOrderID,w.OrderQty,r.ProductID,r.OperationSequence from Production.WorkOrder wCROSS APPLY dbo.fn_WorkOrderRouting(w.WorkOrderID) as rORDER 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.WorkOrderIDORDER 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;--如果來源表無法匹配到,就刪除
T-SQL CROSS APPLY、MERGE