错误:对 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 SERVER语句提示错误 delete top (5) FROM (SELECT top 100 percent * FROM 表名 ORDER BY DATE0) a