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 Bikespodkategorie 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;