【问题标题】:Postgres: missing FROM-clause entry for tablePostgres:缺少表的 FROM 子句条目
【发布时间】: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 为您做了很多。

标签: sql postgresql


【解决方案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"
        

        【讨论】:

          猜你喜欢
          • 2021-03-02
          • 1970-01-01
          • 1970-01-01
          • 2020-04-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多