Delen via


Subquery's

Van toepassing op:Azure Synapse ANALYTICSAnalytics Platform System (PDW)SQL-eindpunt in Microsoft FabricWarehouse in Microsoft Fabric

In dit onderwerp vindt u voorbeelden van het gebruik van subquery's in Azure Synapse Analytics, Analytics Platform System (PDW) of Microsoft Fabric.

Zie SELECT (Transact-SQL) voor de SELECT-instructie

Inhoud

Basisbeginselen

Subquery
Een subquery is een query die is genest in een SELECT-, INSERT-, UPDATE- of DELETE-instructie of in een andere subquery. Dit wordt ook wel een interne query of inner select genoemd.

Buitenste query
De instructie die de subquery bevat. Dit wordt ook wel een outer select genoemd.

Gecorreleerde subquery
Een subquery die verwijst naar een tabel in de buitenste query.

Voorbeelden: Azure Synapse Analytics and Analytics Platform System (PDW)

In deze sectie vindt u voorbeelden van subquery's die worden ondersteund in Azure Synapse Analytics of Analytics Platform System (PDW).

A. TOP en ORDER BY in een subquery

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

B. HAVING-component met een gecorreleerde subquery

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. Gecorreleerde subquery's met analyses

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

D. Gecorreleerde samenvoegingsinstructies in een subquery

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

E. Predicaten samenvoegen in een subquery

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

F. Gecorreleerde joinpredicaten in een subquery

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

G. Gecorreleerde subselecties als gegevensbronnen

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

H. Gecorreleerde subquery's in de gegevenswaarden die worden gebruikt met aggregaties

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

I. IN gebruiken met een gecorreleerde subquery

In het volgende voorbeeld wordt gebruikgemaakt IN van een gecorreleerde of herhalende subquery. Dit is een query die voor de waarden afhankelijk is van de buitenste query. De interne query wordt herhaaldelijk uitgevoerd, één keer voor elke rij die door de buitenste query kan worden geselecteerd. Met deze query wordt één exemplaar opgehaald van de EmployeeKey plus voor- en achternaam van elke werknemer waarvoor de OrderQuantity in de FactResellerSales tabel is 5 en waarvoor de werknemersidentificatienummers overeenkomen in de DimEmployee tabellen en 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. EXISTS versus IN gebruiken met een subquery

In het volgende voorbeeld ziet u query's die semantisch gelijkwaardig zijn om het verschil tussen het gebruik van het EXISTS trefwoord en het IN trefwoord te illustreren. Beide zijn voorbeelden van een subquery die één exemplaar van elke productnaam ophaalt waarvoor de productsubcategorie is Road Bikes. ProductSubcategoryKey komt overeen tussen de DimProduct tabellen en 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;  

of

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

K. Meerdere gecorreleerde subquery's gebruiken

In dit voorbeeld worden twee gecorreleerde subquery's gebruikt om de namen te vinden van werknemers die een bepaald product hebben verkocht.

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;