Unterabfragen
Gilt für:Azure Synapse AnalyticsAnalytics Platform System (PDW)SQL Analytics-Endpunkt in Microsoft FabricWarehouse in Microsoft Fabric
In diesem Thema finden Sie Beispiele für die Verwendung von Unterabfragen in Azure Synapse Analytics, Analytics Platform System (PDW) oder Microsoft Fabric.
Informationen zur SELECT-Anweisung finden Sie unter SELECT (Transact-SQL).
Contents
Grundlagen
Unterabfrage
Eine Unterabfrage ist eine Abfrage, die in einer SELECT-, INSERT-, UPDATE- oder DELETE-Anweisung bzw. in einer anderen Unterabfrage geschachtelt ist. Dies wird auch als innere Abfrage oder innerer Select-Ausdruck bezeichnet.
Äußere Abfrage
Die Anweisung, die die Unterabfrage enthält. Dies wird auch eine äußerer Select-Ausdruck bezeichnet.
Korrelierte Unterabfrage
Eine Unterabfrage, die auf eine Tabelle in der äußeren Abfrage verweist.
Beispiele: Azure Synapse Analytics und Analytics-Plattformsystem (PDW)
Dieser Abschnitt enthält Beispiele für in Azure Synapse Analytics oder Analytics-Plattformsystem (PDW) unterstützte Unterabfragen.
A. TOP und ORDER BY in einer Unterabfrage
SELECT * FROM tblA
WHERE col1 IN
(SELECT TOP 100 col1 FROM tblB ORDER BY col1);
B. Korrelierte Unterabfragen in einer HAVING-Klausel
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. Korrelierte Unterabfragen mit Analyse
SELECT * FROM ReplA AS A
WHERE A.ID IN
(SELECT sum(B.ID2) OVER() FROM ReplB AS B WHERE A.ID2 = B.ID);
D: Korrelierte Union-Anweisungen in einer Unterabfrage
SELECT * FROM RA
WHERE EXISTS
(SELECT 1 FROM RB WHERE RB.b1 = RA.a1
UNION ALL SELECT 1 FROM RC);
E. JOIN-Prädikate in einer Unterabfrage
SELECT * FROM RA INNER JOIN RB
ON RA.a1 = (SELECT COUNT(*) FROM RC);
F. Korrelierte JOIN-Prädikate in einer Unterabfrage
SELECT * FROM RA
WHERE RA.a2 IN
(SELECT 1 FROM RB INNER JOIN RC ON RA.a1=RB.b1+RC.c1);
G. Korrelierte untergeordnete SELECT-Ausdrücke als Datenquellen
SELECT * FROM RA
WHERE 3 = (SELECT COUNT(*)
FROM (SELECT b1 FROM RB WHERE RB.b1 = RA.a1) X);
H. Korrelierte Unterabfragen in den mit Aggregaten verwendeten Datenwerten
SELECT Rb.b1, (SELECT RA.a1 FROM RA WHERE RB.b1 = RA.a1) FROM RB GROUP BY RB.b1;
I. Verwenden von IN mit einer korrelierten Unterabfrage
Im folgenden Beispiel wird IN
in einer abhängigen oder sich wiederholenden Unterabfrage verwendet. Die Werte dieser Abfrage sind von der äußeren Abfrage abhängig. Die innere Abfrage wird wiederholt ausgeführt, und zwar einmal für jede Zeile, die von der äußeren Abfrage ausgewählt wird. Diese Abfrage ruft eine Instanz des EmployeeKey
plus den Vor- und Nachnamen der einzelnen Mitarbeiter ab, für die die OrderQuantity
in der FactResellerSales
-Tabelle 5
beträgt und für die die Mitarbeiter-IDs in der DimEmployee
- und FactResellerSales
-Tabelle übereinstimmen.
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. Verwenden von EXISTS im Vergleich zu IN in einer Unterabfrage
Im folgenden Beispiel werden Abfragen, die semantisch ähnlich sind, gezeigt, und der Unterschied zwischen der Verwendung des EXISTS
-Schlüsselworts und des IN
-Schlüsselworts wird veranschaulicht. Beides sind Beispiele für eine Unterabfrage, die eine Instanz von jedem Produktnamen abruft, für die die Produktunterkategorie Road Bikes
ist. ProductSubcategoryKey
vergleicht die DimProduct
- und die DimProductSubcategory
-Tabelle.
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;
oder
SELECT DISTINCT EnglishProductName
FROM DimProduct AS dp
WHERE dp.ProductSubcategoryKey IN
(SELECT ProductSubcategoryKey
FROM DimProductSubcategory
WHERE EnglishProductSubcategoryName = 'Road Bikes')
ORDER BY EnglishProductName;
K. Verwenden von mehreren abhängigen Unterabfragen
In diesem Beispiel werden zwei abhängige Unterabfragen verwendet, um die Namen von Mitarbeitern zu finden, die ein bestimmtes Produkt verkauft haben.
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;
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Tickets als Feedbackmechanismus für Inhalte auslaufen lassen und es durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unter:Feedback senden und anzeigen für