次の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
_は避けてください。 _FROM fibra ff, fibra fp
_の代わりに明示的なJOINを使用するようにクエリを修正すると、たとえばFROM fibra ff INNER JOIN fibra fp ON (ff.fibra_pai_id = fp.id)
でWHERE
句から_ff.fibra_pai_id = fp.id
_を省略すると、期待どおりの結果が得られます。
A.H.がリンクしているこの質問を参照してください。
明示的結合と暗黙的結合の混合は、「テーブルのエントリがあります...が、クエリのこの部分から参照できません」)で失敗します
クエリ内のすべての結合を明示的に変換して、発生している問題を回避します。暗黙的なものと明示的なものを残さないでください。
これはうまくいくはずです:
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)