在SQL Server2005以後,提供了Apply的功能
Apply 的功能類似 Join 主要是將兩張資料表做處理
但是差別在於 Join 是將兩張資料表根據指定的關聯進行結合
而 Apply 則是有一個目標資料表,將其欄位內容丟入另一個輔助資料表 ( Sub Query、Table Value Function)
取出對應的欄位資料,附於目標資料表的欄位
主要是用在查詢目標資料表時,順便去對應出輔助資料表中對應的資料(像是最新一筆、最大數量...等)
一張主表去對一張記錄表的概念
範例資料設定
CREATE TABLE dbo.Category ( CategoryID int primary key, CategoryName nvarchar(20) )
GO
CREATE TABLE dbo.Product
( ProductID int primary key,ProductName nvarchar(20),CategoryID int,UnitPrice int )
GO
INSERT INTO dbo.Category
VALUES(1,'Category1'),(2,'Category2'),(3,'Category3')
INSERT INTO dbo.Product
VALUES(1,'A',1,10),(2,'B',1,25),(3,'C',1,5),(4,'D',1,15),(5,'E',2,10),
(6,'F',2,20),(7,'G',2,25),(8,'H',3,20),(9,'I',3,10),(10,'J',3,5)
說明
分別建立類別跟產品的資料表,每一個產品都屬於特定類別
問題
想要取得各類別底下單位售價最高的產品
範例方法
SELECT c.CategoryName,p.ProductName,p.UnitPrice
FROM dbo.Category c Cross Apply
(
SELECT TOP 1 ProductName,UnitPrice
FROM dbo.Product
WHERE CategoryID=c.CategoryID
ORDER BY UnitPrice DESC
)p
使用子查詢先對產品進行UnitPrice的排序,再透過Cross Apply的方式
將類別的編號CategoryID傳入子查詢中,取得最高售價的產品資訊
(也可以建立Table-Value Function將CategoryID傳入)
這邊注意到對應的是資料表而非取得單一值
如果要取出前三高的產品資訊就變更Top1-->Top3