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

Posted

技术标签:

【中文标题】错误:对 FROM 子句的无效引用【英文标题】:ERROR: invalid reference to FROM-clause 【发布时间】:2012-10-29 03:33:32 【问题描述】:

我有以下 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

有谁知道我做错了什么?

【问题讨论】:

What's wrong with this query? 的可能重复项 这个问题也一样:***.com/questions/187146/… 这能回答你的问题吗? Inner join & outer join; is the order of tables in from important? 【参考方案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)

【讨论】:

在这种情况下,解释您在查询中更改的内容可能有助于发帖者了解 什么 错误以及为什么,而不仅仅是复制新查询文本来修复它。【参考方案2】:

您正在混合隐式和显式 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) 并从 WHERE 子句中省略 ff.fibra_pai_id = fp.id,您应该会得到预期的结果。

查看 A.H. 链接到的这个问题:

Mixing explicit and implicit joins fails with "There is an entry for table ... but it cannot be referenced from this part of the query"

【讨论】:

谢谢。已阅读此帖子和其他帖子。我只是不知道是昨天我太累了还是解释不是很清楚,但是我无法理解这些内容。但是你今天的解释让我明白了。谢谢。 旧版 FROM?真的吗?它用于计算笛卡尔积,你甚至需要它来使用INNER JOIN,不是吗? postgresql.org/docs/9.3/static/sql-select.html#SQL-FROM @AlexisWilke FROM 在任何意义上当然都不是“遗产”。非 ansi 连接语法 FROM table1, table2 WHERE tablea.id = tableb.id 通常被认为是,但更倾向于使用 ANSI 内部连接。如果你想要一个未经过滤的笛卡尔积,你可以使用tablea CROSS JOIN tableb,让你的意图明确。【参考方案3】:

在我的情况下,问题是我忘记了我已将我的表分配给特定架构并需要引用那些例如:

select r.*
from my_schema.resources r

【讨论】:

以上是关于错误:对 FROM 子句的无效引用的主要内容,如果未能解决你的问题,请参考以下文章

HQL 错误:with 子句引用了两个不同的 from 子句元素

SQL 错误“视图中的 ORDER BY 子句无效...”

SQL SERVER语句提示错误 delete top (5) FROM (SELECT top 100 percent * FROM 表名 ORDER BY DATE0) a

iOS - 未解决的错误导致崩溃:悬挂对无效对象的引用

如何解决 OleDb 错误“FROM 子句中的语法错误”?

SQL Server 查询错误 -ORDER BY 子句在视图中无效