Postgres:缺少表的FROM子句条目

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...
                                                             ^

我在 Stack Overflow 上搜寻了类似这个问题的帖子(missing FROM-clause entry for table),但是没有找到解决方法。非常感谢任何帮助。


2
你尝试将第一个 JOIN 放在底部了吗?你试图在加入 payments_action 之前加入 scenarios_scenario - Dmitry
1
@marmeladze 虽然 SQL 没有问题,但 Django 中的 ORM 可以为您完成很多工作。 - hd1
@hd1 当然,但我不太喜欢Django的ORM,我认为它设计得更加复杂 -)) - marmeladze
不,实际上并不是这样的——如果您发布您的模型类,我很乐意重写您的查询。 - hd1
请看此链接获取相关编程内容翻译:https://gist.github.com/marmeladze/87075548b0fb8de1082e95b112603803 - marmeladze
显示剩余3条评论
4个回答

27

在你的第一次连接中,'payments_action' 不是一个已知的关系。请按照一定方式重新排列你的连接,以便新的连接仅使用已经“定义”的关系。

以下是一个演示这个问题的链接:

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


7

修改代码,使每个表在使用另一个联接的列之前先进行联接。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 
);

5
你正在使用[payments_action]表中的字段加入到[scenarios_scenario]表中。
连接必须按顺序进行,也就是说,除非这些表在语句之前出现,否则不能使用ON语句引用来自表的字段。
希望能帮到你。

1

我遇到了类似的错误信息,但是与别名命名有关。 例如,以下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" // added quotes
select a_dr.address_line1 from core_addresses as "a_dr" // snake case

这是非常重要的信息,我之前不知道,谢谢! - Mr. Sam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接