Oracle [Ошибка] Выполнение (31: 5): ORA-00904: неверный идентификатор - PullRequest
1 голос
/ 27 апреля 2020

Я написал следующий запрос

SELECT TPD.*, 
   FMP.*
   FROM TABLE TPD
LEFT JOIN 
(SELECT *
FROM TBL FMP
WHERE FMP.FE6_MILEPOST_SEQ_I = 0)
ON FMP.FE6_MILEPOST_I = TPD.CURR_STATION_MP_I 

Два вложенных запроса внутри работают по отдельности, но при объединении выдает следующую ошибку

[Ошибка] Выполнение (31: 5): ORA-00904: «FMP». «FE6_MILEPOST_I»: неверный идентификатор

Ответы [ 2 ]

0 голосов
/ 27 апреля 2020

Подзапросу нужен псевдоним, поэтому вы можете ссылаться на столбцы, которые он возвращает во внешнем запросе.

Но здесь я бы предложил упростить предложение FROM. Использование подзапроса не имеет смысла, так что вы можете просто go:

SELECT ...
FROM TABLE TPD
LEFT JOIN TBL FMP
    ON  FMP.FE6_MILEPOST_SEQ_I = 0
    AND FMP.FE6_MILEPOST_I = TPD.CURR_STATION_MP_I 
0 голосов
/ 27 апреля 2020

Вы должны создать псевдоним вашей производной таблицы, например, так:

(SELECT FMP.FE6_MILEPOST_I,
   FMP.OPERATIONAL_REGION_C,
   FMP.OPERATIONAL_REGION_N,
   FMP.OPERATING_ZONE_C,
   FMP.OPERATING_ZONE_N,
   FMP.OPERATING_SUBDIVISION_C,
   FMP.OPERATING_SUBDIVISION_N
FROM TBL FMP
WHERE FMP.FE6_MILEPOST_SEQ_I = 0) FMP

Псевдоним FMP, который вы дали TBL в производной таблице, не "экранирует" msgstr "область вложенных имен производной таблицы. Т.е. вы не можете «увидеть» это имя таблицы со стороны. Не задавая производной таблице никакого имени, вы можете ссылаться только на ее спроецированные столбцы без уточнения.

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

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