Kueri secara sintaksis adalah SQL, bahkan jika table_btidak memiliki namekolom. Alasannya adalah resolusi ruang lingkup.
Ketika kueri diuraikan, pertama-tama diperiksa apakah table_bmemiliki namekolom. Karena tidak, maka table_adiperiksa. Itu akan menimbulkan kesalahan hanya jika tabel tidak memiliki namekolom.
Akhirnya kueri dijalankan sebagai:
select a.*
from table_a a
where a.name in (select a.name
from table_b b
);
Adapun hasil kueri akan memberikan, untuk setiap baris table_a, subquery (select name from table_b)- atau (select a.name from table_b b)- adalah tabel dengan satu kolom dengan nilai yang sama a.namedan baris sebanyak table_b. Jadi, jika table_bmemiliki 1 baris atau lebih, kueri berjalan sebagai:
select a.*
from table_a a
where a.name in (a.name, a.name, ..., a.name) ;
atau:
select a.*
from table_a a
where a.name = a.name ;
atau:
select a.*
from table_a a
where a.name is not null ;
Jika table_bkosong, kueri tidak akan mengembalikan baris (thnx ke @ughai untuk menunjukkan kemungkinan itu).
Itu (fakta bahwa Anda tidak mendapatkan kesalahan) mungkin adalah alasan terbaik bahwa semua referensi kolom harus diawali dengan nama tabel / alias. Jika kueri adalah:
select a.* from table_a where a.name in (select b.name from table_b);
Anda akan langsung mendapat kesalahan. Ketika awalan tabel dihilangkan, tidak sulit untuk kesalahan tersebut terjadi, terutama dalam permintaan yang lebih kompleks, dan bahkan yang lebih penting, tidak diperhatikan.
Baca juga di Oracle docs: Resolusi Nama dalam Pernyataan SQL Statis , contoh serupa B-6 dalam tangkapan dalam dan rekomendasi dalam paragraf Menghindari Penangkapan Dalam di paragraf SELECT dan DML Statement :
Kualifikasi setiap referensi kolom dalam pernyataan dengan alias tabel yang sesuai.