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_actions 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 子句条目的主要内容,如果未能解决你的问题,请参考以下文章

如何修复“缺少表的 FROM 子句条目”?

查询中的错误 - 缺少表的 FROM 子句条目 - SQL

Rails PG::UndefinedTable: 错误: 缺少表的 FROM 子句条目

返回导致错误:缺少表的 FROM 子句条目

表“令牌”的缺少FROM子句条目

TypeORM:[364] 错误:在字符 401 处缺少表“userorganisation”的 FROM 子句条目