Postgresql 错误:对FROM子句的引用无效

Postgresql 错误:对FROM子句的引用无效,postgresql,join,Postgresql,Join,我有以下SQL(PostgreSQL)查询: 但这给了我一个错误: 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 que

我有以下SQL(PostgreSQL)查询:

但这给了我一个错误:

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

有人知道我做错了什么吗?

将查询中的所有联接转换为显式联接,以避免出现问题--不要保留一些隐式联接,另一些则显式联接

这应该起作用:

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)

您正在混合隐式联接和显式联接。正如您刚刚发现的,这通常会让人感到困惑,并导致意外的评估顺序问题

您应该始终使用
JOIN。。。在
上,语法无处不在;避免表1、表2中遗留的
。如果您更正查询以使用显式连接而不是fibra ff中的
,fibra fp
,例如fibra ff中的
内部连接fibra fp ON(ff.fibra_pai_id=fp.id)
并从
WHERE
子句中省略
ff.fibra_pai_id=fp.id
,您应该会得到预期的结果

请参见A.H.链接到的问题:


这个问题可能重复的地方也是一样的:在这种情况下,一个说明你在查询中更改了什么的注释可能会帮助海报理解什么是错误的以及原因,而不仅仅是复制新的查询文本来修复它。谢谢。我读过这篇文章和其他文章。我只是不知道昨天我是不是太累了,或者解释不是很清楚,但是读了这些我就不明白了。但你今天的解释让我明白了。谢谢。从
下载的遗留
?真正地它是用来计算笛卡尔积的,你甚至需要它来使用
内部连接
,不是吗@亚历克西斯·威尔克(Alexiswillke)当然不是任何意义上的“遗产”。表1、表2中的非ansi连接语法
,其中tablea.id=tableb.id
通常被认为是,而ansi内部连接则更受欢迎。如果你想要一个未过滤的笛卡尔积,你可以使用
表a交叉连接表b
,明确你的意图。
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)