サブクエリ

適用対象:Azure Synapse AnalyticsAnalytics Platform System (PDW)Microsoft Fabric の SQL 分析エンドポイントMicrosoft Fabric のウェアハウス

このトピックでは、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. サブクエリ内の相関 UNION ステートメント

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 を使用しています。 これは、外側のクエリによって値が決まるクエリです。 内側のクエリは、外側のクエリが選択する行に対して 1 回ずつ、繰り返し実行されます。 このクエリは、FactResellerSales テーブルの OrderQuantity5 で、従業員の ID 番号が DimEmployee テーブルと FactResellerSales テーブルで一致する各従業員の EmployeeKey と姓名のインスタンスを 1 つ取得します。

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 である各製品名の 1 つのインスタンスを取得するサブクエリの例です。 ProductSubcategoryKeyDimProduct テーブルと 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;  

または

SELECT DISTINCT EnglishProductName  
FROM DimProduct AS dp   
WHERE dp.ProductSubcategoryKey IN  
    (SELECT ProductSubcategoryKey  
     FROM DimProductSubcategory   
     WHERE EnglishProductSubcategoryName = 'Road Bikes')  
ORDER BY EnglishProductName;  

K. 複数の相関サブクエリを使用する

この例では、2 つの相関サブクエリを使って、特定の製品を販売した従業員の名前を検索します。

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;