Share via


Korrelierte Unterabfragen

Viele Abfragen können ausgewertet werden, indem die Unterabfrage einmal ausgeführt wird und die Ergebniswerte in die WHERE-Klausel der äußeren Abfrage eingesetzt werden. In Abfragen mit einer korrelierten Unterabfrage (auch wiederholte Unterabfrage genannt) hängt die Unterabfrage für ihre Werte von der äußeren Abfrage ab. Das bedeutet, dass die Unterabfrage wiederholt ausgeführt wird, und zwar einmal für jede Zeile, die von der äußeren Abfrage ausgewählt werden könnte.

Diese Abfrage ruft eine Instanz des Vor- und Nachnamens der einzelnen Mitarbeiter ab, für die die Prämie in der SalesPerson-Tabelle 5.000 beträgt und für die die Mitarbeiter-IDs in der Employee-Tabelle und der SalesPerson-Tabelle übereinstimmen.

USE AdventureWorks2008R2;
GO
SELECT DISTINCT c.LastName, c.FirstName, e.BusinessEntityID 
FROM Person.Person AS c JOIN HumanResources.Employee AS e
ON e.BusinessEntityID = c.BusinessEntityID 
WHERE 5000.00 IN
    (SELECT Bonus
    FROM Sales.SalesPerson sp
    WHERE e.BusinessEntityID = sp.BusinessEntityID) ;
GO

Dies ist das Resultset.

LastName FirstName BusinessEntityID

-------------------------- ---------- ------------

Ansman-Wolfe Pamela 280

Saraiva José 282

(2 Zeile(n) betroffen)

Die vorherige Unterabfrage in dieser Anweisung kann nicht unabhängig von der äußeren Abfrage ausgewertet werden. Sie benötigt einen Wert für Employee.BusinessEntityID, wobei sich dieser Wert jedoch ändert, während SQL Server unterschiedliche Zeilen in Employee untersucht.

Diese Abfrage wird exakt wie folgt ausgewertet: SQL Server untersucht für jede Zeile der Employee-Tabelle die Aufnahme in die Ergebnisse, indem in der inneren Abfrage der Wert jeder Zeile ersetzt wird. Wenn SQL Server beispielsweise zunächst die Zeile für Syed Abbas überprüft, nimmt die Variable Employee.BusinessEntityID den Wert 285 an, den SQL Server in die innere Abfrage einsetzt.

USE AdventureWorks2008R2;
GO
SELECT Bonus
FROM Sales.SalesPerson
WHERE BusinessEntityID = 285;

Das Ergebnis ist 0 (Syed Abbas erhielt keine Prämie, weil er kein Vertriebsmitarbeiter ist), sodass die äußere Abfrage ausgewertet wird zu:

USE AdventureWorks2008R2;
GO
SELECT LastName, FirstName
FROM Person.Person AS c JOIN HumanResources.Employee AS e
ON e.BusinessEntityID = c.BusinessEntityID 
WHERE 5000 IN (0.00)

Da dies falsch ist, wird die Zeile zu Syed Abbas nicht in die Ergebnisse eingeschlossen. Durchlaufen Sie mit der Zeile zu Pamela Ansman-Wolfe dieselbe Prozedur. Sie werden feststellen, dass diese Zeile in den Ergebnissen vorhanden ist.

Korrelierte Unterabfragen können auch Tabellenwertfunktionen in die FROM-Klausel einschließen, indem ein Verweis auf Spalten aus einer Tabelle in der äußeren Abfrage als ein Argument der tabellenwertigen Funktion erfolgt. In diesem Fall wird die Tabellenwertfunktion für jede Zeile in der äußeren Abfrage entsprechend der Unterabfrage bewertet.