Запит є синтаксично правильним SQL, навіть якщо table_b
він не має name
стовпця. Причина - розв'язання сфери.
Коли запит розбирається, спочатку перевіряється, чи table_b
є name
стовпець. Оскільки це не так, то table_a
це перевірено. Помилка видасть лише те, що в жодній із таблиць не було name
стовпця.
Нарешті запит виконується як:
select a.*
from table_a a
where a.name in (select a.name
from table_b b
);
Що стосується результатів, то запит давав би для кожного рядка table_a
підзапит (select name from table_b)
- або (select a.name from table_b b)
- це таблиця з одним стовпцем з тим самим a.name
значенням і стільки ж рядків table_b
. Отже, якщо table_b
має 1 або більше рядків, запит працює як:
select a.*
from table_a a
where a.name in (a.name, a.name, ..., a.name) ;
або:
select a.*
from table_a a
where a.name = a.name ;
або:
select a.*
from table_a a
where a.name is not null ;
Якщо table_b
порожній, запит не поверне жодних рядків (thnx до @ughai для вказівки на цю можливість).
Це (той факт, що ви не помилитесь), мабуть, найкраща причина, що всі посилання стовпців мають бути встановлені з назвою таблиці / псевдонімом. Якщо запит був:
select a.* from table_a where a.name in (select b.name from table_b);
ви отримали б помилку відразу. Якщо опущення префіксів таблиці опущено, подібні помилки не важко, особливо у більш складних запитах, а ще важливіше, залишаються непоміченими.
Читайте також у документах Oracle: Дозвіл імен у статичних операторах SQL, аналогічний приклад B-6 у Внутрішньому захопленні та рекомендації у розділі " Уникнення внутрішнього захоплення" у параграфах тверджень SELECT та DML :
Кваліфікуйте кожне посилання стовпця у виписці з відповідним псевдонімом таблиці.