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 Autoren ab, für die der Tantiemenprozentsatz in der SalesPerson-Tabelle 5000 beträgt und die Autoren-IDs in der Employee- und der SalesPerson-Tabelle übereinstimmen.

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

Dies ist das Resultset.

LastName FirstName EmployeeID

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

Ansman-Wolfe Pamela 280

Saraiva José 282

(2 row(s) affected)

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.EmployeeID, 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.EmployeeID den Wert 288 an, den SQL Server in die innere Abfrage einsetzt.

USE AdventureWorks;
GO
SELECT Bonus
FROM Sales.SalesPerson
WHERE SalesPersonID = 288;

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

USE AdventureWorks;
GO
SELECT LastName, FirstName
FROM Person.Contact c JOIN HumanResources.Employee e
ON e.ContactID = c.ContactID 
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.