SQL Server SubQuery 子查詢筆記
2021-02-13
筆記關於關聯式資料庫的子查詢的使用技巧,包含 Non-Corrleate、Corrleate 等子查詢以及結合 Exists 述詞的使用方式。
說明
SQL Server 的子查詢一定要帶 AS 。
SELECT * FROM (
SELECT FROM dbo.TableName
) AS SubQuery
Non-Correlated SubQuery 非關聯子查詢
Temp Table
將查詢結果的資料表作為另一個查詢的來源(FROM)。
SELECT SubQuery.* FROM
(
SELECT
[ProductCategoryID]
,[ParentProductCategoryID]
,[Name]
,[ModifiedDate]
FROM [SalesLT].[ProductCategory]
WHERE [ParentProductCategoryID] IS NOT NULL
) AS SubQuery
Scalar
可以用於 Where 條件、 Having 條件
SELECT * FROM dbo.TableName
WHERE C1 >
(
SELECT Num FROM dbo.TableName
) AS SubQuery
Columns
可以結合如 In、ANY、SOME、ALL 等 Predicate
SELECT * FROM dbo.TableName
where C1 IN
(
SELECT C2 FROM dbo.TableName
) AS SubQuery
Correlated SubQuery 關聯子查詢
使用情境:
分類(sub where) → 彙總(sub select) → 篩選條件(outer where)
情境1:找出商品中大於商品所屬分類平均值的項目
商品 → 平均值 → 大於
SELECT
P1.ProductID,
P1.ListPrice,
P1.ProductCategoryID,
(
SELECT AVG(P2.ListPrice) FROM
[SalesLT].[Product] AS P2
WHERE P1.ProductCategoryID = P2.ProductCategoryID
) AS CategoryAvgPrice
FROM [SalesLT].[Product] AS P1
WHERE P1.ListPrice >
(
SELECT AVG(P2.ListPrice)
FROM [SalesLT].[Product] AS P2
WHERE P1.ProductCategoryID = P2.ProductCategoryID
)
情境2:列出各資產擁有者所擁有的資產數
擁有人 → 計數
情境2 可以使用 Group By 去做,但需要額外處理分類後的相關欄位;反之對於分類資料表,使用關聯子查詢的方式來計算,語法十分簡易明確。
USE [AdventureWorksLT2019];
SELECT
(
SELECT COUNT(*)
FROM [SalesLT].[Product] AS P
WHERE P.ProductCategoryID = PC.ProductCategoryID
) AS ProductCount,
*
FROM [SalesLT].[ProductCategory] AS PC
結合 EXISTS 述詞(Predicate)使用
持續編輯中 🧙♂️