34

次の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

誰かが私が間違っていることを知っていますか?

4

3 に答える 3

41

暗黙的な JOIN と明示的な JOIN を混在させています。これは一般的に読みにくいものであり、今発見したように、予期しない評価順序の問題につながります。

どこでも一貫してJOIN ... ON構文を使用する必要があります。レガシーを避けるFROM table1, table2FROM fibra ff, fibra fpたとえば、代わりに明示的な JOIN を使用するようにクエリを修正し、句FROM fibra ff INNER JOIN fibra fp ON (ff.fibra_pai_id = fp.id)を省略ff.fibra_pai_id = fp.idしたWHERE場合、期待される結果が得られるはずです。

AH がリンクしたこの質問を参照してください。

明示的結合と暗黙的結合を混在させると、「テーブルのエントリがあります...しかし、クエリのこの部分から参照することはできません」で失敗する

于 2012-11-09T00:53:42.867 に答える
2

クエリ内のすべての結合を明示的に変換して、発生している問題を回避します。暗黙的なものと明示的なものを残さないでください。

これはうまくいくはずです:

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)
于 2012-11-08T20:49:37.413 に答える