W zagnieżdżonych podkwerendach można używać tych samych aliasów, co w zapytaniu nadrzędnym, chociaż może to być nieco mylące dla osoby czytającej kod. Przestrzeń nazw dla aliasów w zagnieżdżonym podzapytaniu jest oddzielna od przestrzeni nazw w obiekcie nadrzędnym. Na przykład poniższe zapytanie zawiera zagnieżdżone podzapytanie, b
które ma również b
używany alias . Byłoby to potencjalnie mylące dla programisty, ale w porządku z silnikiem DBMS:
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
W skorelowanym podzapytaniu masz dostęp do aliasów rodzica, więc aliasy muszą być unikalne w zapytaniu nadrzędnym i skorelowanym podzapytaniu. Jeśli weźmiemy skorelowane podkwerendy, takie jak poniższe, mamy jedną globalną przestrzeń nazw współdzieloną między kwerendą nadrzędną a skorelowaną podkwerendą:
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)
Skorelowane podzapytanie nie ma aliasu, ponieważ nie uczestniczy w sprzężeniu jako takim 1 . Odnośniki b
i b2
for bar
są dostępne dla podkwerendy, ponieważ skorelowane podkwerendy współużytkują swoją przestrzeń nazw dla aliasów z rodzicem.
1 Zauważ, że optymalizator może zdecydować się na użycie operatorów łączenia w planie za kulisami, chociaż rzeczywista określona operacja jest skorelowanym podzapytaniem, a nie złączeniem z podzapytaniem zagnieżdżonym.