Share via


Qualifizieren von Spaltennamen in Unterabfragen

Im folgenden Beispiel wird die CustomerID-Spalte in der WHERE-Klausel der äußeren Abfrage implizit durch den Tabellennamen Sales.Store in der FROM-Klausel der äußeren Abfrage qualifiziert. Der Verweis auf CustomerID in der Auswahlliste der Unterabfrage wird durch die FROM-Klausel der Unterabfrage qualifiziert, also durch die Sales.Customer-Tabelle.

USE AdventureWorks;
GO
SELECT Name
FROM Sales.Store
WHERE CustomerID NOT IN
    (SELECT CustomerID
     FROM Sales.Customer
     WHERE TerritoryID = 5)

Allgemein gilt die Regel, dass Spaltennamen in einer Anweisung implizit durch die Tabelle qualifiziert werden, auf die in der FROM-Klausel derselben Ebene verwiesen wird. Wenn eine Spalte in der Tabelle nicht vorhanden ist, auf die in einer FROM-Klausel einer Unterabfrage verwiesen wird, wird sie implizit durch die Tabelle qualifiziert, auf die in der FROM-Klausel der äußeren Abfrage verwiesen wird.

Werden diese impliziten Annahmen angegeben, lautet die Abfrage folgendermaßen:

USE AdventureWorks;
GO
SELECT Name
FROM Sales.Store
WHERE Sales.Store.CustomerID NOT IN
    (SELECT Sales.Customer.CustomerID
     FROM Sales.Customer
     WHERE TerritoryID = 5)

Es empfiehlt sich immer, den Tabellennamen explizit anzugeben, und es ist immer möglich, implizite Annahmen zu Tabellennamen durch explizite Qualifizierungen außer Kraft zu setzen.

VorsichtshinweisVorsicht

Wenn in einer Unterabfrage auf eine Spalte verwiesen wird, die nicht in der Tabelle vorhanden ist, auf die in der FROM-Klausel der Unterabfrage verweisen wird, die jedoch in einer Tabelle vorhanden ist, auf die durch die FROM-Klausel der äußeren Abfrage verwiesen wird, wird die Abfrage ohne Fehler ausgeführt. SQL Server qualifiziert die Spalte in der Unterabfrage explizit mit dem Tabellennamen in der äußeren Abfrage.