Está bien que las subconsultas anidadas utilicen los mismos alias que se usan en la consulta principal, aunque puede ser un poco confuso para alguien que lee el código. El espacio de nombre para los alias en una subconsulta anidada es independiente del espacio de nombre en el padre. Por ejemplo, la consulta a continuación tiene una subconsulta anidada b
que también tiene un alias b
utilizado. Esto sería potencialmente confuso para el programador, pero está bien con el motor 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
En una subconsulta correlacionada, tiene acceso a los alias principales, por lo que los alias deben ser únicos en la consulta principal y la subconsulta correlacionada. Si tomamos una subconsulta correlacionada como la siguiente, tenemos un espacio de nombre global único compartido entre la consulta principal y la 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)
La subconsulta correlacionada no tiene un alias ya que no participa en una unión como tal 1 . Las referencias b
y b2
for bar
están disponibles para la subconsulta ya que las subconsultas correlacionadas comparten su espacio de nombres para los alias con el padre.
1 Tenga en cuenta que el optimizador puede elegir usar operadores de unión dentro del plan detrás de escena, aunque la operación real especificada es una subconsulta correlacionada y no una unión contra una subconsulta anidada.