Zapytanie jest poprawnym składniowo SQL, nawet jeśli table_bnie ma namekolumny. Powodem jest rozdzielczość zakresu.
Podczas analizy zapytania najpierw sprawdza się, czy table_bma namekolumnę. Ponieważ tak nie jest, to table_ajest sprawdzane. Zgłasza błąd tylko wtedy, gdy żadna z tabel nie ma namekolumny.
Na koniec zapytanie jest wykonywane jako:
select a.*
from table_a a
where a.name in (select a.name
from table_b b
);
Jeśli chodzi o wyniki, zapytanie dałoby, dla każdego wiersza table_apodzapytania (select name from table_b)- lub (select a.name from table_b b)- jest tabelą z pojedynczą kolumną o tej samej a.namewartości i tyle samo wierszy co table_b. Tak więc, jeśli table_bma 1 lub więcej wierszy, zapytanie działa jako:
select a.*
from table_a a
where a.name in (a.name, a.name, ..., a.name) ;
lub:
select a.*
from table_a a
where a.name = a.name ;
lub:
select a.*
from table_a a
where a.name is not null ;
Jeśli table_bjest puste, zapytanie nie zwróci żadnych wierszy (dziękuję @ughai za wskazanie tej możliwości).
To (fakt, że nie pojawia się błąd) jest prawdopodobnie najlepszym powodem, dla którego wszystkie odwołania do kolumn powinny być poprzedzone nazwą / aliasem tabeli. Jeśli zapytanie było:
select a.* from table_a where a.name in (select b.name from table_b);
od razu dostaniesz błąd. Gdy pominięto prefiksy tabel, nie jest trudno popełnić takie błędy, szczególnie w bardziej złożonych zapytaniach, a co ważniejsze, pozostają niezauważone.
Przeczytaj także w dokumentach Oracle: Rozpoznawanie nazw w statycznych instrukcjach SQL podobny przykład B-6 w przechwytywaniu wewnętrznym i zalecenia w unikaniu wewnętrznego przechwytywania w akapitach instrukcji SELECT i DML :
Kwalifikuj każde odwołanie do kolumny w instrukcji za pomocą odpowiedniego aliasu tabeli.