Postgres:缺少表的 FROM 子句条目
Posted
技术标签:
【中文标题】Postgres:缺少表的 FROM 子句条目【英文标题】:Postgres: missing FROM-clause entry for table 【发布时间】:2017-09-18 08:37:19 【问题描述】:我正在尝试对 postgres 上的 4 个表执行连接查询。
表名:
scenarios_scenario
payments_invoice
payments_payment
payments_action
(所有那些奇怪的名字都是 django 生成的 -)))
关系:
scenarios_scenario
[有很多] payments_action
s
payments_action
【有一个】payments_invoice
payments_action
【有一个】payments_payment
下面是一个有效的查询,
SELECT payments_invoice.*,
(payments_payment.to_be_paid - payments_payment.paid) as remaining, \
payments_action.identificator
FROM payments_invoice
JOIN payments_payment
ON payments_invoice.action_id = payments_payment.action_id
AND payments_payment.full_payment=2
JOIN payments_action
ON payments_invoice.action_id = payments_action.id
AND payments_action.identificator = %s
我只想从另一个表中检索相关字段并编写另一个查询,例如
SELECT
scenarios_scenario.title, payments_invoice.*, \
(payments_payment.to_be_paid - payments_payment.paid) as remaining, \
payments_action.identificator, payments_action.scenario_id
FROM payments_invoice
JOIN scenarios_scenario
ON scenarios_scenario.id = payments_action.scenario_id
JOIN payments_payment
ON payments_invoice.action_id = payments_payment.action_id
AND payments_payment.full_payment=2
JOIN payments_action
ON payments_invoice.action_id = payments_action.id
AND payments_action.identificator = 'EEE45667';
但面临这个错误 -
ERROR: missing FROM-clause entry for table "payments_action"
LINE 2: ...IN scenarios_scenario ON scenarios_scenario.id = payments_a...
^
在 SO 中寻找类似的问题 (missing FROM-clause entry for table) 但无法找到方法。任何帮助,将不胜感激。
【问题讨论】:
请发布您的python代码? 我对 python 没有任何问题。一旦我能够修复此查询,将使用django.db.connection
-))
您是否尝试过将您的第一个 JOIN
移动到底部?在加入 payments_action
之前,您尝试加入 scenarios_scenario
。
感谢@Dmitriy -)) 移到底部,这有效
@marmeladze 虽然 SQL 没有任何问题,但 django 中的 ORM 为您做了很多。
【参考方案1】:
在您第一次加入时,“payments_action”不是已知关系。以新连接仅使用已“定义”的关系的方式重新排序您的连接。
这是一个小提琴,演示了这个问题:
http://sqlfiddle.com/#!17/ed147/5
【讨论】:
【参考方案2】:更改代码,以便在从另一个连接中调用列之前连接每个表。 postgres 查询规划器按顺序读取连接,以便在您的代码表中 scenarios_scenario
被连接到表 payments_invoice
并正在寻找与 payments_action
的匹配项,但查询规划器不知道 payments_action
是什么.新代码应该是:
SELECT
scenarios_scenario.title, payments_invoice.*, \
(payments_payment.to_be_paid - payments_payment.paid) as remaining, \
payments_action.identificator, payments_action.scenario_id
FROM payments_invoice
JOIN payments_action
ON (
payments_invoice.action_id = payments_action.id
AND payments_action.identificator = 'EEE45667'
)
JOIN scenarios_scenario
ON (
scenarios_scenario.id = payments_action.scenario_id
)
JOIN payments_payment
ON (
payments_invoice.action_id = payments_payment.action_id
AND payments_payment.full_payment=2
);
【讨论】:
【参考方案3】:您正在使用 [payments_action] 中的字段加入表 [scenarios_scenario]。
联接必须按顺序进行,即您不能使用 ON 语句引用表中的字段,除非它们的表在语句之前。
希望有帮助
【讨论】:
【参考方案4】:我有类似的问题,但与别名命名有关。
例如下面的 sql 查询不起作用并抛出相同的错误missing FROM-clause entry for table
:
select aDr.address_line1 from core_addresses as "aDr"
如果您在别名中使用大写字母,则必须使用双引号或改用snake_case
。
以下查询可解决此问题:
select "aDr".address_line1 from core_addresses as "aDr"
select a_dr.address_line1 from core_addresses as "a_dr"
【讨论】:
以上是关于Postgres:缺少表的 FROM 子句条目的主要内容,如果未能解决你的问题,请参考以下文章