サブクエリ
適用対象: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
テーブルの OrderQuantity
が 5
で、従業員の 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 つのインスタンスを取得するサブクエリの例です。 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;
または
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;
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示