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, так сказать. Может кто-нибудь объяснить, почему или где мы будем использовать ситуацию запроса, подобную приведенной выше, потому что я почти чувствую, что это должно быть ошибкой в ​​системе.

1 ответ

Решение

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

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

Другие вопросы по тегам