Poddotazy
Platí pro:Azure Synapse AnalyticsAnalytics Platform System (PDW)Koncový bod SQL ve službě Microsoft FabricWarehouse v Microsoft Fabric
Toto téma obsahuje příklady použití poddotazů v Azure Synapse Analytics, Analytics Platform System (PDW) nebo Microsoft Fabric.
Informace o příkazu SELECT najdete v tématu SELECT (Transact-SQL).
Obsah
Základy
Poddotaz
Poddotaz je dotaz, který je vnořený do příkazu SELECT, INSERT, UPDATE nebo DELETE nebo do jiného poddotazu. Označuje se také jako vnitřní dotaz nebo vnitřní výběr.
Vnější dotaz
Příkaz, který obsahuje poddotaz. Říká se tomu také vnější výběr.
Korelovaný poddotaz
Poddotaz, který odkazuje na tabulku ve vnějším dotazu.
Příklady: Azure Synapse Analytics and Analytics Platform System (PDW)
Tato část obsahuje příklady poddotazů podporovaných v Azure Synapse Analytics nebo Analytics Platform System (PDW).
A. TOP a ORDER BY v poddotazu
SELECT * FROM tblA
WHERE col1 IN
(SELECT TOP 100 col1 FROM tblB ORDER BY col1);
B. Klauzule HAVING se korelovaným poddotazem
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. Korelace poddotazů s analýzami
SELECT * FROM ReplA AS A
WHERE A.ID IN
(SELECT sum(B.ID2) OVER() FROM ReplB AS B WHERE A.ID2 = B.ID);
D. Korelované sjednocovací příkazy v poddotazu
SELECT * FROM RA
WHERE EXISTS
(SELECT 1 FROM RB WHERE RB.b1 = RA.a1
UNION ALL SELECT 1 FROM RC);
E. Spojení predikátů v poddotazu
SELECT * FROM RA INNER JOIN RB
ON RA.a1 = (SELECT COUNT(*) FROM RC);
F. Korelované predikáty spojení v poddotazu
SELECT * FROM RA
WHERE RA.a2 IN
(SELECT 1 FROM RB INNER JOIN RC ON RA.a1=RB.b1+RC.c1);
G. Korelované dílčí výběry jako zdroje dat
SELECT * FROM RA
WHERE 3 = (SELECT COUNT(*)
FROM (SELECT b1 FROM RB WHERE RB.b1 = RA.a1) X);
H. Korelované poddotazy v datových hodnotách používaných s agregacemi
SELECT Rb.b1, (SELECT RA.a1 FROM RA WHERE RB.b1 = RA.a1) FROM RB GROUP BY RB.b1;
I. Použití in se korelovaným poddotazem
Následující příklad používá IN
v korelovaném nebo opakujícím se poddotazu. Jedná se o dotaz, který závisí na jeho hodnotách na vnějším dotazu. Vnitřní dotaz se spouští opakovaně, jednou pro každý řádek, který může být vybrán vnějším dotazem. Tento dotaz načte jednu instanci EmployeeKey
jména a příjmení plus každého zaměstnance, pro kterého OrderQuantity
je 5
v FactResellerSales
tabulce a pro kterého se identifikační čísla zaměstnanců shodují v DimEmployee
tabulkách a 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. Použití příkazu EXISTS a IN s poddotazem
Následující příklad ukazuje dotazy, které jsou sémanticky ekvivalentní k ilustraci rozdílu mezi použitím klíčového EXISTS
slova a klíčového IN
slova. Oba jsou příklady poddotazů, který načte jednu instanci každého názvu produktu, pro který je Road Bikes
podkategorie produktu . ProductSubcategoryKey
mezi tabulkami DimProduct
a 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;
Nebo
SELECT DISTINCT EnglishProductName
FROM DimProduct AS dp
WHERE dp.ProductSubcategoryKey IN
(SELECT ProductSubcategoryKey
FROM DimProductSubcategory
WHERE EnglishProductSubcategoryName = 'Road Bikes')
ORDER BY EnglishProductName;
K. Použití více korelovaných poddotazů
V tomto příkladu se používají dva korelované poddotazy k vyhledání jmen zaměstnanců, kteří prodali konkrétní produkt.
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;