table_b
Bir name
sütun olmasa bile sorgu sözdizimsel olarak doğru SQL'dir . Sebebi kapsam çözümlemesidir.
Sorgu ayrıştırıldığında, önce table_b
bir name
sütunun olup olmadığı kontrol edilir . Olmadığından, o table_a
zaman kontrol edilir. Yalnızca tabloların hiçbirinde name
sütun yoksa, bir hata verir .
Sonunda sorgu şu şekilde yürütülür:
select a.*
from table_a a
where a.name in (select a.name
from table_b b
);
Sorgunun vereceği sonuçlara gelince, her satır table_a
için alt sorgu (select name from table_b)
- veya (select a.name from table_b b)
- aynı a.name
değerde ve aynı sayıda satır içeren tek bir sütuna sahip bir tablodur table_b
. Bu nedenle, table_b
1 veya daha fazla satır varsa, sorgu şu şekilde çalışır:
select a.*
from table_a a
where a.name in (a.name, a.name, ..., a.name) ;
veya:
select a.*
from table_a a
where a.name = a.name ;
veya:
select a.*
from table_a a
where a.name is not null ;
Eğer table_b
boş, sorgu (thnx için @ughai ihtimalini işaret için) hiçbir satır döndürür.
Bu (bir hata alamadığınız gerçeği) muhtemelen tüm sütun referanslarının tablo adı / takma adıyla birlikte ön eklenmesi gerektiğinin en iyi nedenidir. Eğer sorgu:
select a.* from table_a where a.name in (select b.name from table_b);
hatayı hemen alırdınız. Tablo önekleri ihmal edildiğinde, bu tür hataların, özellikle daha karmaşık sorgularda ve daha da önemlisi, fark edilmeden yapılması zor değildir.
Oracle belgelerinde de okuyun : Statik SQL İfadelerinde Adların Çözümü İç yakalamada benzer örnek B-6 ve SELECT ve DML İfadeleri paragraflarında İç Yakalamayı Önlemek'deki tavsiyeler :
İfadedeki her sütun referansını uygun tablo diğer adıyla nitelendirin.