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.
Vorsicht |
---|
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. |
Siehe auch