子查詢
適用于: Microsoft Fabric 中 Microsoft Fabric 倉儲中的 Azure Synapse Analytics Analytics 平臺系統 (PDW) SQL 分析端點
本主題提供在 Azure Synapse Analytics、Analytics Platform System (PDW) 或 Microsoft Fabric 中使用子查詢的範例。
如需了解 SELECT 陳述式,請參閱 SELECT (Transact-SQL)
內容
基本概念
子查詢
子查詢是指在 SELECT、INSERT、UPDATE 或 DELETE 陳述式中,或在另一個子查詢之中為巢狀的。 這也稱為內部查詢或內部選取。
外部查詢
包含子查詢的陳述式。 這也稱為外部選取。
相互關聯的子查詢
參考外部查詢中資料表的子查詢。
範例:Azure Synapse Analytics 和 Analytics Platform System (PDW)
本節提供 Azure Synapse Analytics 或 Analytics Platform System (PDW) 中支援的子查詢範例。
A. 子查詢中的 TOP 和 ORDER BY
SELECT * FROM tblA
WHERE col1 IN
(SELECT TOP 100 col1 FROM tblB ORDER BY col1);
B. 含有相互關聯子查詢的 HAVING 子句
SELECT dm.EmployeeKey, dm.FirstName, dm.LastName
FROM DimEmployee AS dm
GROUP BY dm.EmployeeKey, dm.FirstName, dm.LastName
HAVING 5000 <=
(SELECT sum(OrderQuantity)
FROM FactResellerSales AS frs
WHERE dm.EmployeeKey = frs.EmployeeKey)
ORDER BY EmployeeKey;
C. 含有分析的相互關聯子查詢
SELECT * FROM ReplA AS A
WHERE A.ID IN
(SELECT sum(B.ID2) OVER() FROM ReplB AS B WHERE A.ID2 = B.ID);
D. 子查詢中相互關聯的聯集陳述式
SELECT * FROM RA
WHERE EXISTS
(SELECT 1 FROM RB WHERE RB.b1 = RA.a1
UNION ALL SELECT 1 FROM RC);
E. 子查詢中的聯結述詞
SELECT * FROM RA INNER JOIN RB
ON RA.a1 = (SELECT COUNT(*) FROM RC);
F. 子查詢中相互關聯的聯結述詞
SELECT * FROM RA
WHERE RA.a2 IN
(SELECT 1 FROM RB INNER JOIN RC ON RA.a1=RB.b1+RC.c1);
G. 作為資料來源的相互關聯子選擇
SELECT * FROM RA
WHERE 3 = (SELECT COUNT(*)
FROM (SELECT b1 FROM RB WHERE RB.b1 = RA.a1) X);
H. 與彙總搭配使用的資料值中相互關聯子查詢
SELECT Rb.b1, (SELECT RA.a1 FROM RA WHERE RB.b1 = RA.a1) FROM RB GROUP BY RB.b1;
I. 搭配相互關聯子查詢使用 IN
下列範例在相關或重複的子查詢中使用 IN
。 這是一項相依於外部查詢來取得其值的查詢。 內部查詢會重複執行,針對外部查詢可能選取的每個資料列各執行一次。 這個查詢會擷取一個 EmployeeKey
執行個體,再加上 FactResellerSales
資料表中 OrderQuantity
為 5
且員工識別碼在 DimEmployee
和 FactResellerSales
資料表中相符之每位員工的名字和姓氏。
SELECT DISTINCT dm.EmployeeKey, dm.FirstName, dm.LastName
FROM DimEmployee AS dm
WHERE 5 IN
(SELECT OrderQuantity
FROM FactResellerSales AS frs
WHERE dm.EmployeeKey = frs.EmployeeKey)
ORDER BY EmployeeKey;
J. 搭配子查詢使用 EXISTS 和 IN 之比較
下列範例示範語意相等的查詢,以說明使用 EXISTS
關鍵字和 IN
關鍵字之間的差異。 兩者都是子查詢的範例,會針對產品子類別為 Road Bikes
的每個產品名稱各擷取一個執行個體。 ProductSubcategoryKey
會在 DimProduct
與 DimProductSubcategory
資料表之間進行比對。
SELECT DISTINCT EnglishProductName
FROM DimProduct AS dp
WHERE EXISTS
(SELECT *
FROM DimProductSubcategory AS dps
WHERE dp.ProductSubcategoryKey = dps.ProductSubcategoryKey
AND dps.EnglishProductSubcategoryName = 'Road Bikes')
ORDER BY EnglishProductName;
Or
SELECT DISTINCT EnglishProductName
FROM DimProduct AS dp
WHERE dp.ProductSubcategoryKey IN
(SELECT ProductSubcategoryKey
FROM DimProductSubcategory
WHERE EnglishProductSubcategoryName = 'Road Bikes')
ORDER BY EnglishProductName;
K. 使用多個相互關聯的子查詢
這個範例利用相關的子查詢來尋找銷售了特定產品的員工名稱。
SELECT DISTINCT LastName, FirstName, e.EmployeeKey
FROM DimEmployee e JOIN FactResellerSales s ON e.EmployeeKey = s.EmployeeKey
WHERE ProductKey IN
(SELECT ProductKey FROM DimProduct WHERE ProductSubcategoryKey IN
(SELECT ProductSubcategoryKey FROM DimProductSubcategory
WHERE EnglishProductSubcategoryName LIKE '%Bikes'))
ORDER BY LastName;
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應