Share via


子查詢

適用于: 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 資料表中 OrderQuantity5 且員工識別碼在 DimEmployeeFactResellerSales 資料表中相符之每位員工的名字和姓氏。

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 會在 DimProductDimProductSubcategory資料表之間進行比對。

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;