ネストされたサブクエリは、親クエリで使用されるものと同じエイリアスを使用しても問題ありませんが、コードを読んでいる人にとっては少し混乱するかもしれません。ネストされたサブクエリのエイリアスの名前空間は、親の名前空間とは別です。たとえば、次のクエリにはネストされたサブクエリb
があり、そのサブクエリ内でもエイリアスがb
使用されています。これはプログラマを混乱させる可能性がありますが、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
相関サブクエリでは、親のエイリアスにアクセスできるため、エイリアスは親クエリと相関サブクエリ全体で一意である必要があります。以下のような相関サブクエリを使用する場合、親クエリと相関サブクエリ間で共有される単一のグローバル名前空間があります。
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オプティマイザーは、背後で計画内で結合演算子を使用することを選択できることに注意してください。ただし、指定された実際の操作は相関サブクエリであり、ネストされたサブクエリに対する結合ではありません。