【问题标题】:How to do *this particular* update + join in PostgreSQL 9.2.13?如何在 PostgreSQL 9.2.13 中执行 *此特定 * 更新 + 加入?
【发布时间】:2016-03-15 08:21:23
【问题描述】:

好的。我知道这个用例already has a question devoted to it here,但我已经尝试过那里的任何语法,但我越来越绝望了。

这是我的查询:

with ids as (
  select t.id ntid, ot.id otid, p.id npid, op.id opid, ot.company_id ocid, t.company_id ncid
  from product_template t
  inner join product_template ot on t.multicompany_old_id = ot.id
  inner join product_product p on p.product_tmpl_id = t.id
  inner join product_product op on op.product_tmpl_id = ot.id
)
update ol
set product_id = i.npid
from sale_order_line ol
inner join sale_order o on ol.order_id = o.id
inner join product_product p on ol.product_id = p.id
inner join ids i on p.id = i.opid and o.company_id = i.ncid;

我尝试过的变体:

update [sale_order_line] ol
set [ol.]product_id = i.npid
from...

update sale_order_line ol
set ol.product_id = i.npid
inner join ....

update sale_order_line ol
set product_id = i.npid
from sale_order o on ol.order_id = o.id
inner join product_product p on ol.product_id = p.id
inner join ids i on p.id = i.opid and o.company_id = i.ncid
where ol.order_id = o.id;

没有任何作用。有人可以帮助我吗? 我想以下简化案例的解决方案也足够了:

update T
set T.value = J.value
from some_table T
inner join joined_table J on J.some_table_id = T.id;

【问题讨论】:

    标签: sql postgresql postgresql-9.2


    【解决方案1】:

    试试这个:

    WITH ids AS (
        SELECT
            t.id ntid,
            ot.id otid,
            p.id npid,
            op.id opid,
            ot.company_id ocid,
            t.company_id ncid
        FROM product_template t
            INNER JOIN product_template ot ON t.multicompany_old_id = ot.id
            INNER JOIN product_product p ON p.product_tmpl_id = t.id
            INNER JOIN product_product op ON op.product_tmpl_id = ot.id
    )
    UPDATE sale_order_line
    SET product_id = i.npid
    FROM sale_order_line ol
        INNER JOIN sale_order o ON ol.order_id = o.id
        INNER JOIN product_product p ON ol.product_id = p.id
        INNER JOIN ids i ON p.id = i.opid AND o.company_id = i.ncid
    WHERE sale_order_line.id = ol.id;
    

    这个想法是您要更新的表在FROM 部分之外,并且要进行更新,您需要标记在哪些情况下您需要使用WHERE 部分更新数据。

    【讨论】:

    • 这是 mysql 语法。在 postgres 中,您不必将更新的目标添加到 from 列表中。
    • @wildplasser 所以你说where 可以省略吗?
    • 不,from sale_order_line ol 可以省略,但这会导致需要重新调整术语。
    • @wildplasser 很酷,我明天会尝试调整我的答案,谢谢!
    • 也许你可以保留这个答案,并在 wildplasser 的答案中进行调整,然后(因为我在这里有表格)我会测试它直到错误消失
    【解决方案2】:

    您不需要将更新中的 target 表添加/加入到FROM // 'JOIN' 列表中;它已经在范围表中。

    WITH ids AS (
      SELECT t.id ntid, ot.id otid, p.id npid
            , op.id opid, ot.company_id ocid, t.company_id ncid
      FROM product_template t
      JOIN product_template ot ON t.multicompany_old_id = ot.id 
      JOIN product_product p ON p.product_tmpl_id = t.id
      JOIN product_product op ON op.product_tmpl_id = ot.id 
    )
    UPDATE sale_order_line ol -- <<-- target table has an alias
    SET product_id = i.npid   -- <<-- product_id SHOULD NOT use this alias
    FROM ids i 
    JOIN sale_order o ON o.company_id = i.ncid;
    JOIN product_product p ON p.id = i.opid
    WHERE ol.product_id = p.id   -- <<-- target table is linked    
    AND ol.order_id = o.id       -- <<-- to the source(s) here
            ;
    

    【讨论】:

    • 查询错误:错误:对表“ol”的 FROM 子句条目的引用无效第 11 行:在 ol.product_id = p.id 上加入 product_product p 提示:表“ol”有一个条目",但不能从这部分查询中引用它。
    • 是的,您需要稍微重新排列连接的表。 BRB。
    • 仍然给出同样的错误。分号也放错了地方。另外,Yuri 打败了你 :-) 他的查询有效。不过非常感谢
    猜你喜欢
    • 2011-12-13
    • 2011-10-01
    • 1970-01-01
    • 2018-02-19
    • 2023-02-05
    • 1970-01-01
    • 2021-01-06
    • 1970-01-01
    相关资源
    最近更新 更多