Добре для вкладених підзапитів використовувати ті ж псевдоніми, що і батьківський запит, хоча це може бути дещо заплутаним для того, хто читає код. Простір імен для псевдонімів вкладеного підзапиту є окремим від простору імен у батьків. Наприклад, запит нижче містить вкладений підзапит, 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
для, bar
і обидва доступні для підзапиту, оскільки корельовані підзапити мають спільний простір імен для псевдонімів з батьківським.
1 Зауважте, що оптимізатор може вибрати оператори приєднання в рамках плану за кадром, хоча фактично вказана операція є корельованим підзапитом, а не об'єднанням із вкладеним підзапитом.