Il est acceptable que les sous-requêtes imbriquées utilisent les mêmes alias que ceux utilisés dans la requête parent, bien que cela puisse être un peu déroutant pour quelqu'un qui lit le code. L'espace de noms pour les alias d'une sous-requête imbriquée est distinct de l'espace de noms sur le parent. Par exemple, la requête ci-dessous a une sous b
- requête imbriquée qui contient également un alias b
. Ce serait potentiellement déroutant pour le programmeur mais très bien avec le moteur SGBD:
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
Sur une sous-requête corrélée, vous avez accès aux alias du parent, de sorte que les alias doivent être uniques dans la requête parent et la sous-requête corrélée. Si nous prenons une sous-requête corrélée telle que celle ci-dessous, nous avons un seul espace de nom global partagé entre la requête parent et la sous-requête corrélée:
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 sous-requête corrélée n'a pas d'alias car elle ne participe pas à une jointure en tant que telle 1 . Les références b
et b2
for bar
sont toutes deux disponibles pour la sous-requête, car les sous-requêtes corrélées partagent leur espace de noms pour les alias avec le parent.
1 Notez que l'optimiseur peut choisir d'utiliser les opérateurs de jointure dans le plan en arrière-plan, bien que l'opération réelle spécifiée soit une sous-requête corrélée et non une jointure contre une sous-requête imbriquée.