Смешные подзапросы Oracle

Представьте запрос

SELECT Col_A FROM TABLE_A WHERE Col_A IN (SELECT Col_A FROM TABLE_B) 

За исключением того, что в TABLE_B нет столбца Col_A; Он есть только у TABLE_A. Я пробовал это в Oracle 12, и я не уверен, как далеко это уходит в версиях, но похоже, что он возвращает действительный результат отображения всех данных Col_A из TABLE_A. Как разработчик, я ожидаю, что что-то подобное вызовет ошибку, поскольку внутренний запрос, так сказать, даже не обращается к TABLE_A снова. Может кто-нибудь объяснить, почему или где мы будем использовать ситуацию с запросом, подобную приведенной выше, потому что я почти чувствую, что это должна быть ошибка в системе.


person user1111871    schedule 22.02.2018    source источник
comment
поясните точно..версия и правильный контекст у вас есть реальное тому доказательство..   -  person scaisEdge    schedule 22.02.2018
comment
@scaisEdge - вы можете легко это проверить: в схеме SCOTT попробуйте select sal from emp where sal in (select sal from dept), а затем измените sal на comm (три раза), чтобы увидеть, что произойдет, когда в столбце будет NULL. Или, если у вас нет доступа к SCOTT, попробуйте его на любых двух таблицах, просто убедитесь, что столбец не существует во второй таблице. Кроме того, версия и контекст в данном случае не имеют значения.   -  person mathguy    schedule 23.02.2018
comment
Вот почему рекомендуется всегда включать ссылки на таблицы для столбцов (например, Table_b.col_a). Останавливает этот тип ошибок.   -  person Clockwork-Muse    schedule 23.02.2018


Ответы (1)


Это не ошибка. Поскольку вы не уточнили столбец, Oracle интерпретирует его как текущее значение столбца из таблицы A, которое находится в пределах области видимости (см. a соответствующий подзапрос). Таким образом, подзапрос просто создает столько дубликатов значения этого столбца, сколько строк в таблице B.

В зависимости от этого условие in станет либо истинным, либо ложным. Всегда будет false, если таблица B пуста. Это также будет ложно в случаях, когда Col_A равно нулю. Но во всех остальных случаях это будет верно. Таким образом, вы получите столько результатов, сколько строк в таблице A имеют ненулевое значение в Col_A, за исключением случаев, когда таблица B пуста, и в этом случае вы не получите никаких результатов.

person trincot    schedule 22.02.2018