Для вложенных подзапросов нормально использовать те же псевдонимы, что и в родительском запросе, хотя это может немного смущать читателя кода. Пространство имен для псевдонимов во вложенном подзапросе отделено от пространства имен в родительском. Например, приведенный ниже запрос имеет вложенный подзапрос, в b
котором также используется псевдоним b
. Это могло бы сбить с толку программиста, но хорошо с механизмом СУБД:
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
В коррелированном подзапросе у вас есть доступ к псевдонимам родителя, поэтому псевдонимы должны быть уникальными для родительского запроса и коррелированного подзапроса. Если мы возьмем коррелированный подзапрос, такой как приведенный ниже, у нас будет одно глобальное пространство имен, совместно используемое между родительским запросом и коррелированным подзапросом:
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)
Коррелированный подзапрос не имеет псевдонима, так как он не участвует в объединении как таковом 1 . Ссылки b
и b2
for bar
доступны для подзапроса, так как коррелированные подзапросы совместно используют свое пространство имен для псевдонимов с родителем.
1 Обратите внимание, что оптимизатор может выбрать использование операторов соединения в плане за кулисами, хотя указанная фактическая операция является коррелированным подзапросом, а не объединением с вложенным подзапросом.