ОШИБКА: неверная ссылка на FROM-clause

Вопрос:У меня есть следующий запрос SQL (PostgreSQL): SELECT ff.*, fp.* FROM fibra ff, fibra fp JOIN cables cp ON fp.cable_id = cp.id LEFT OUTER JOIN terceiro ced_pai ON ced_pai.id = cp.cedente_id LEFT OUTER JOIN terceiro tp ON tp.id = fp.terceiro_id JOIN cables cf ON ff.cable_id = cf.id LEFT OUTER JOIN terceiro ced_f ON ced_f.id =

Вопрос:

У меня есть следующий запрос SQL (PostgreSQL):

SELECT ff.*, fp.* FROM fibra ff, fibra fp JOIN cables cp ON fp.cable_id = cp.id LEFT OUTER JOIN terceiro ced_pai ON ced_pai.id = cp.cedente_id LEFT OUTER JOIN terceiro tp ON tp.id = fp.terceiro_id JOIN cables cf ON ff.cable_id = cf.id LEFT OUTER JOIN terceiro ced_f ON ced_f.id = cf.cedente_id LEFT OUTER JOIN terceiro tf ON tf.id = ff.terceiro_id where ff.fibra_pai_id = fp.id AND ff.cable_id IN (8,9,10) AND fp.cable_id IN (8,9,10)

Но это дает мне эту ошибку:

ERROR: invalid reference to FROM-clause entry for table «ff» LINE 8: JOIN cables cf ON ff.cable_id = cf.id ^ HINT: There is an entry for table «ff», but it cannot be referenced from this part of the query. ********** Error ********** ERROR: invalid reference to FROM-clause entry for table «ff» SQL state: 42P01 Hint: There is an entry for table «ff», but it cannot be referenced from this part of the query. Character: 261

Кто-нибудь знает, что я делаю неправильно?

Лучший ответ:

Вы смешиваете неявные и явные JOIN. Это обычно путано читать и приводит к неожиданным проблемам с оценкой оценки, как вы только что узнали.

Вы должны последовательно использовать синтаксис JOIN … ON везде; избегайте старого FROM table1, table2. Если вы исправите свой запрос, чтобы использовать явный JOIN вместо FROM fibra ff, fibra fp, например FROM fibra ff INNER JOIN fibra fp ON (ff.fibra_pai_id = fp.id) и опустить ff.fibra_pai_id = fp.id из предложения WHERE, вы должны получить ожидаемый результат.

Смотрите этот вопрос, который A.H. связан с:

Смешение явных и неявных объединений завершается неудачей с помощью”. Есть запись для таблицы… но на нее нельзя ссылаться из этой части запроса

Ответ №1

Попробуйте следующее:

SELECT ff.*, fp.* FROM fibra ff JOIN fibra fp ON ff.fibra_pai_id = fp.id JOIN cables cp ON fp.cable_id = cp.id LEFT OUTER JOIN terceiro ced_pai ON ced_pai.id = cp.cedente_id LEFT OUTER JOIN terceiro tp ON tp.id = fp.terceiro_id JOIN cables cf ON ff.cable_id = cf.id LEFT OUTER JOIN terceiro ced_f ON ced_f.id = cf.cedente_id LEFT OUTER JOIN terceiro tf ON tf.id = ff.terceiro_id WHERE ff.cable_id IN (8,9,10) AND fp.cable_id IN (8,9,10)

Оцените статью
Добавить комментарий