SQL Server SubQuery 子查詢筆記

2021-02-13

筆記關於關聯式資料庫的子查詢的使用技巧,包含 Non-Corrleate、Corrleate 等子查詢以及結合 Exists 述詞的使用方式。

SQL Server Logo

說明

SQL Server T-SQL 學習筆記

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)使用

持續編輯中 🧙‍♂️