Subquery's
Van toepassing op:Azure Synapse ANALYTICS
Analytics Platform System (PDW)
SQL-eindpunt in Microsoft Fabric
Warehouse 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;