оракул игнорирует ошибку неверного идентификатора в подзапросе - PullRequest
0 голосов
/ 17 сентября 2018

Я не понимаю, почему работает следующий запрос, хотя подзапрос выдает ошибку «неверный идентификатор».

SELECT *
FROM aircraft
WHERE airc_manufact IN (SELECT airc_manufact FROM flight);

Мои таблицы выглядят следующим образом (сокращенно):

САМОЛЕТ ( airc_model (PK) , airc_manufact)

ПОЛЕТ ( flt_no (PK) , airc_model (FK) )

Если я запускаю подзапрос самостоятельно, то я получаю ошибку «неверный идентификатор», как и должно быть, поскольку airc_manufacture не является столбцом в таблице полетов.

Если я выполню весь запрос, я не получу сообщение об ошибке. Oracle, похоже, игнорирует подзапрос и, таким образом, выдает мне все строки в таблице самолетов.

Мне кажется, это ошибка, потому что в запросе есть очевидная ошибка. Почему выполняется запрос? Насколько я понимаю, Oracle сначала запустит или оценит подзапрос, а затем выполнит внешний запрос.

1 Ответ

0 голосов
/ 17 сентября 2018

Вы не указали имена столбцов.Итак, вы думаете, что выполняете:

SELECT a.*
FROM aircraft a
WHERE a.airc_manufact IN (SELECT f.airc_manufact FROM flight f);

Если f.airc_manufact не существует, то правила области видимости говорят искать во внешнем запросе.Итак, что вы на самом деле выполняете:

SELECT a.*
FROM aircraft a
WHERE a.airc_manufact IN (SELECT a.airc_manufact FROM flight f);

Это довольно бесполезно в качестве предложения фильтрации.

Мораль: Всегда квалифицирует имена столбцов в запросе, особенноесли запрос ссылается на несколько таблиц.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...