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;