Subqueries

Dotyczy:Azure Synapse AnalyticsAnalytics Platform System (PDW)punkt końcowy analizy SQL w usłudze Microsoft FabricWarehouse w usłudze Microsoft Fabric

Ten temat podaje przykłady wykorzystania podzapytań w Azure Synapse Analytics, Analytics Platform System (PDW) lub Microsoft Fabric Warehouse.

W przypadku instrukcji SELECT zobacz SELECT (Transact-SQL)

Zawartość

Basics

Podzapytanie
Podzapytanie to zapytanie zagnieżdżone wewnątrz instrukcji SELECT, INSERT, UPDATE, lub DELETE instrukcji, albo w innym podzapytaniu. Nazywa się to również zapytaniem wewnętrznym lub wyborem wewnętrznym.

Zapytanie zewnętrzne
Stwierdzenie zawierające podzapytanie. Nazywa się to również selekcją zewnętrzną.

Powiązane podzapytanie
Podzapytanie odnoszące się do tabeli w zewnętrznym zapytaniu.

Przykłady: Azure Synapse Analytics and Analytics Platform System (PDW)

Ta sekcja zawiera przykłady podzapytań obsługiwanych w Azure Synapse Analytics lub Analytics Platform System (PDW).

A. TOP i ORDER BY w podzapytaniu

SELECT * FROM tblA  
WHERE col1 IN  
    (SELECT TOP 100 col1 FROM tblB ORDER BY col1);

B. klauzula HAVING z skorelowanym podzapytaniem

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. Podzapytania skorelowane z analityką

SELECT * FROM ReplA AS A   
WHERE A.ID IN   
    (SELECT sum(B.ID2) OVER() FROM ReplB AS B WHERE A.ID2 = B.ID);  

D. Powiązane zdania o unii w podzapytaniu

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

E. Połączenie predykatów w podzapytaniu

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

F. Skonfederowane predykaty łączenia w podzapytaniu

SELECT * FROM RA   
    WHERE RA.a2 IN   
    (SELECT 1 FROM RB INNER JOIN RC ON RA.a1=RB.b1+RC.c1);  

G. Skorelowane podselekcje jako źródła danych

SELECT * FROM RA   
    WHERE 3 = (SELECT COUNT(*)   
        FROM (SELECT b1 FROM RB WHERE RB.b1 = RA.a1) X);  

H. Powiązane podzapytania w wartościach danych używanych z agregatami

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

I. Używanie IN z powiązanym podzapytaniem

Poniższy przykład wykorzystuje IN w skorelowanym lub powtarzającym się podzapytaniu. Jest to zapytanie zależne od zewnętrznego zapytania o jego wartości. Zapytanie wewnętrzne jest wykonywane wielokrotnie, raz dla każdego wiersza, który może być wybrany przez zewnętrzne zapytanie. To zapytanie pobiera jedno przypadek EmployeeKey imienia plus i nazwiska każdego pracownika, dla którego w tabeli FactResellerSales5 jest to OrderQuantity i dla którego numery identyfikacyjne pracownika zgadzają się w tabelach DimEmployee iFactResellerSales.

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. Użycie EXISTS kontra IN z podzapytaniem

Poniższy przykład pokazuje zapytania o semantycznie równoważnych, aby zilustrować różnicę między użyciem EXISTS słowa kluczowego a słowa IN . Oba są przykładami podzapytania, które pobiera po jednym przypadku każdej nazwy produktu, dla której podkategorią Road Bikesproduktu jest . ProductSubcategoryKey Mecze między DimProduct stołami i I 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;  

lub

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

K. Wykorzystanie wielu skorelowanych podzapytań

Ten przykład wykorzystuje dwa powiązane podzapytania do znalezienia nazwisk pracowników, którzy sprzedali dany 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;