Вопрос по postgresql, join – ОШИБКА: неверная ссылка на предложение FROM

21

У меня есть следующий запрос 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)

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

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

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

возможный дубликатКакие'не так с этим запросом? A.H.
Также этот вопрос тот же:stackoverflow.com/questions/187146/... A.H.

Ваш Ответ

2   ответа
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)
В этом случае заметка, объясняющая, что вы изменили в запросе, может помочь автору понятькакие был неправ иЗачем, а не просто скопировать новый текст запроса, чтобы исправить это. Craig Ringer
25

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

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

Посмотрите на этот вопрос, с которым А.Х. связан:

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

@AlexisWilkeFROM конечно нетнаследие» в любом смысле. Синтаксис неанси-соединенияFROM table1, table2 WHERE tablea.id = tableb.id обычно считается, что вместо этого предпочтительнее использовать внутренние соединения ANSI. Если вы хотите нефильтрованный декартовой продукт, вы можете использоватьtablea CROSS JOIN tablebделая ваши намерения явными. Craig Ringer
Благодарю. Прочитал этот и другие посты. Я просто нене знаю, был ли вчера я слишком устал или объяснения не совсем ясны, но я не могне понимаю смысла читать их. Но ваше сегодняшнее объяснение заставило меня понять. Благодарю. lcguida
наследие FROM? В самом деле? Он используется для вычисленияДекартово произведение и вам нужно даже использоватьINNER JOINне надоты?postgresql.org/docs/9.3/static/sql-select.html#SQL-FROM Alexis Wilke

Похожие вопросы