Tidak apa-apa untuk subqueries bersarang untuk menggunakan alias yang sama seperti yang digunakan dalam kueri induk, meskipun mungkin agak membingungkan bagi seseorang yang membaca kode. Ruang nama untuk alias di subquery bersarang terpisah dari ruang nama di induk. Misalnya kueri di bawah ini memiliki subquery bersarang b
yang juga memiliki alias yang b
digunakan di dalamnya. Ini berpotensi membingungkan bagi programmer tetapi tidak masalah dengan mesin 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
Pada subquery berkorelasi Anda memiliki akses ke alias induk, sehingga alias harus unik di kueri induk dan subquery berkorelasi. Jika kami mengambil subquery berkorelasi seperti yang di bawah ini, kami memiliki satu ruang nama global yang dibagi antara kueri induk dan subquery yang berkorelasi:
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)
Subquery yang dikorelasikan tidak memiliki alias karena tidak berpartisipasi dalam suatu join 1 . Referensi b
dan b2
untuk bar
keduanya tersedia untuk subquery karena subquery yang dikorelasikan berbagi namespace mereka untuk alias dengan induk.
1 Perhatikan bahwa pengoptimal dapat memilih untuk menggunakan operator gabungan dalam rencana di belakang layar, meskipun operasi sebenarnya yang ditentukan adalah subquery berkorelasi dan bukan gabungan terhadap subquery bersarang.