Não há problema em subconsultas aninhadas usarem os mesmos aliases usados na consulta pai, embora possa ser um pouco confuso para alguém ler o código. O espaço de nome para aliases em uma subconsulta aninhada é separado do espaço de nome no pai. Por exemplo, a consulta abaixo tem uma subconsulta aninhada b
que também possui um alias b
usado nela. Isso seria potencialmente confuso para o programador, mas adequado para o mecanismo 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
Em uma subconsulta correlacionada, você tem acesso aos aliases do pai, portanto, os aliases devem ser únicos na consulta pai e na subconsulta correlacionada. Se fizermos uma subconsulta correlacionada como a abaixo, teremos um único espaço de nome global compartilhado entre a consulta pai e a subconsulta correlacionada:
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)
A subconsulta correlacionada não possui um alias, pois não participa de uma associação como tal 1 . As referências b
e b2
for bar
estão disponíveis para a subconsulta, pois as subconsultas correlacionadas compartilham seu espaço de nomes para aliases com o pai.
1 Observe que o otimizador pode optar por usar operadores de junção dentro do plano nos bastidores, embora a operação real especificada seja uma subconsulta correlacionada e não uma junção contra uma subconsulta aninhada.