Subqueries

Platí na:Azure Synapse AnalyticsAnalyticsPlatform System (PDW)SQL analytics endpoint in Microsoft FabricWarehousein Microsoft Fabric

Toto téma uvádí příklady použití poddotazů v Azure Synapse Analytics, Analytics Platform System (PDW) nebo Microsoft Fabric Warehouse.

Pro příkaz SELECT viz SELECT (Transact-SQL)

Obsah

Basics

Poddotaz
Poddotaz je dotaz, který je vnořen do SELECT, INSERT, UPDATE, nebo DELETE příkazu, případně do jiného poddotazu. Tento proces se také nazývá vnitřní dotaz nebo vnitřní výběr.

Vnější dotaz
Tvrzení, které obsahuje poddotaz. Toto se také nazývá vnější selekt.

Korelacovaný poddotaz
Poddotaz, který odkazuje na tabulku ve vnějším dotazu.

Příklady: Azure Synapse Analytics a Analytický platformový systém (PDW)

Tato sekce poskytuje 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 s 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. Korelacované poddotazy s analytikou

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é sjednocené výroky v poddotazu

SELECT * FROM RA   
WHERE EXISTS   
    (SELECT 1 FROM RB WHERE RB.b1 = RA.a1   
     UNION ALL SELECT 1 FROM RC);  

E. Spojte predikáty v poddotazu

SELECT * FROM RA INNER JOIN RB   
    ON RA.a1 = (SELECT COUNT(*) FROM RC);  

F. Korelované predikáty spojů 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é podvý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 agregáty

SELECT Rb.b1, (SELECT RA.a1 FROM RA WHERE RB.b1 = RA.a1) FROM RB GROUP BY RB.b1;  

I. Použití IN s korelovaným poddotazem

Následující příklad používá IN v korelovaném, tedy opakujícím se, poddotazu. Jedná se o dotaz, který závisí na vnějším dotazu na jeho hodnoty. Vnitřní dotaz se provádí opakovaně, jednou pro každý řádek, který může být vybrán vnějším dotazem. Tento dotaz získá jeden případ EmployeeKey plus jména a příjmení každého zaměstnance, pro kterého je v tabulce FactResellerSales5 označeno a OrderQuantity pro které se identifikační čísla zaměstnanců shodují v tabulkách DimEmployee 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í EXISTS versus IN s poddotazem

Následující příklad ukazuje dotazy, které jsou sémanticky ekvivalentní, aby ilustroval rozdíl mezi použitím EXISTS klíčového slova a IN klíčového slova. Oba jsou příklady poddotazu, který získá jednu instanci každého názvu produktu, pro který je produktová podkategorie .Road Bikes ProductSubcategoryKey Zápasy mezi stoly DimProduct a 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ů

Tento příklad používá dva korelované poddotazy k nalezení 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;