Запрос является синтаксически правильным 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 Statements :
Укажите для каждой ссылки на столбец в операторе соответствующий псевдоним таблицы.