Für verschachtelte Unterabfragen ist es in Ordnung, dieselben Aliase wie für die übergeordnete Abfrage zu verwenden, obwohl dies für jemanden, der den Code liest, etwas verwirrend sein kann. Der Namensraum für Aliase in einer verschachtelten Unterabfrage unterscheidet sich vom Namensraum auf dem übergeordneten Element. Die folgende Abfrage enthält beispielsweise eine verschachtelte Unterabfrage b
, in der auch ein Alias b
verwendet wird. Für den Programmierer ist dies möglicherweise verwirrend, für die DBMS-Engine jedoch in Ordnung:
select a.foo
,b.bar
,b.BarCount
from (select b.bar
,count (*) as BarCount
from BarTable b
join OtherTable o
on b.OtherTableID = o.OtherTableID
group by b.bar) b
join Foobar a
on a.bar = b.bar
In einer korrelierten Unterabfrage haben Sie Zugriff auf die Aliase der übergeordneten Abfrage, sodass die Aliase in der übergeordneten Abfrage und in der korrelierten Unterabfrage eindeutig sein müssen. Wenn wir eine korrelierte Unterabfrage wie die folgende verwenden, haben wir einen einzigen globalen Namensraum, der von der übergeordneten Abfrage und der korrelierten Unterabfrage gemeinsam genutzt wird:
select a.foo
,b.bar
from Foobar a
join Bar b
on b.FooBarID = a.FooBarID
where not exists
(select 1
from Bar b2
where b2.BarCategoryID = b.BarCategoryID
and b2.BarDate > b.BarDate)
Die korrelierte Unterabfrage hat keinen Alias, da sie nicht an einem Join als solchem teilnimmt 1 . Die Referenzen b
und b2
für bar
stehen der Unterabfrage beide zur Verfügung, da korrelierte Unterabfragen ihren Namespace für Aliase mit dem übergeordneten Element teilen.
1 Beachten Sie, dass das Optimierungsprogramm im Hintergrund möglicherweise Verknüpfungsoperatoren im Plan verwendet, obwohl der angegebene Vorgang eine korrelierte Unterabfrage und keine Verknüpfung mit einer verschachtelten Unterabfrage ist.