Saya punya query SQL yang alias sama dengan beberapa alias subquerynya.
Sebagai contoh:
select *
from ROOM r
where ...
(
select *
from ROAD r
where ...
)
Ini berfungsi dengan baik, karena alias subquery tampaknya menyembunyikan yang utama.
- Apakah akan bekerja seperti itu dalam semua kasus?
- Apakah saya akan mendapatkan hasil yang tidak ditentukan?
- Jika tidak apa-apa untuk melakukan itu, bagaimana saya bisa membuat referensi ke pertanyaan utama
r
?
sql-server
t-sql
subquery
alias
IcySnow
sumber
sumber
Jawaban:
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 yangb
digunakan di dalamnya. Ini berpotensi membingungkan bagi programmer tetapi tidak masalah dengan mesin DBMS: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:
Subquery yang dikorelasikan tidak memiliki alias karena tidak berpartisipasi dalam suatu join 1 . Referensi
b
danb2
untukbar
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.
sumber
SELECT * FROM ( SELECT c FROM T ) AS T2;
- tidak ada yang bergabung, belum ada korelasi dengan standar SQL yang mensyaratkan bahwa tabel yang diturunkan diberi variabel rentang (T2
dalam hal ini).ConcernedOfTunbridgeWells, Anda menulis (penekanan saya): "Pada subquery berkorelasi Anda memiliki akses ke alias orangtua, sehingga alias harus unik di kueri induk dan subquery berkorelasi."
Saya tidak percaya keunikan diperlukan. Saya percaya bahwa, jika alias digunakan dalam subquery berkorelasi sebagai nama korelasi, serta alias tabel dalam kueri luar, alias dalam subquery akan diutamakan.
Contoh:
Outputnya adalah "3": tabel T dan U memiliki 2 dan 3 persamaan, tetapi
WHERE
predikat selanjutnya menyaring baris yang dikembalikan ke 3, dan 2 tidak ada di V.sumber