close

在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

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 Louis 的頭像
    Louis

    Louis學習筆記

    Louis 發表在 痞客邦 留言(0) 人氣()