繁体   English   中英

Postgres:缺少表的 FROM 子句条目

[英]Postgres: missing FROM-clause entry for table

我正在尝试对 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 中寻找类似的问题( 缺少表的 FROM 子句条目)但无法找到方法。 任何帮助,将不胜感激。

在您的第一次加入中,“payments_action”不是已知的关系。 以新连接仅使用已经“已定义”关系的方式重新排序连接。

这是一个小提琴,展示了这个问题:

http://sqlfiddle.com/#!17/ed147/5

更改代码,以便在从另一个联接中调用其中的列之前加入每个表。 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 
);

您正在使用[payments_action]中的字段加入表[scenario_scenario]。

连接必须按顺序连接,即除非它们的表位于语句之前,否则不能使用ON语句引用表中的字段。

希望有所帮助

我有类似的问题,但与别名命名有关。 例如,以下 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"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM