我正在尝试在postgres上为4个表执行连接查询.
表名:
scenarios_scenariopayments_invoicepayments_paymentpayments_action(所有这些奇怪的名字都是由django生成的 - )))
关系:
scenarios_scenario[有很多] payments_actionspayments_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
Run Code Online (Sandbox Code Playgroud)
我只是想从另一个表中检索一个相关的字段,并写了另一个查询
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';
Run Code Online (Sandbox Code Playgroud)
但面对这个错误 -
ERROR: missing FROM-clause entry for table "payments_action"
LINE 2: ...IN scenarios_scenario ON scenarios_scenario.id = payments_a...
^
Run Code Online (Sandbox Code Playgroud)
在SO中查找类似的问题(缺少表格的FROM子句条目),但无法找到方法.任何帮助,将不胜感激.
Lap*_*csa 11
在您的第一次加入中,"payments_action"不是已知的关系.以新连接仅使用已经"已定义"关系的方式重新排序连接.
这是一个小提琴,展示了这个问题:
http://sqlfiddle.com/#!17/ed147/5
小智 6
更改代码,以使您先联接每个表,然后再在另一个联接中调用该表中的列。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
);
Run Code Online (Sandbox Code Playgroud)
您正在使用 [payments_action] 中的字段加入表 [scenarios_scenario]。
连接必须按顺序进行,即您不能使用 ON 语句引用表中的字段,除非它们的表在语句之前。
希望有帮助
| 归档时间: |
|
| 查看次数: |
26741 次 |
| 最近记录: |