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 пуста, и в этом случае вы не получите результатов.