【问题标题】:oracle merge query in postgrespostgres中的oracle合并查询
【发布时间】:2021-05-27 04:21:35
【问题描述】:

我在 oracle 中有这个合并查询,它工作正常。现在我们正在迁移到 postgres 10 并尝试在 postgres 中找到等效的。

MERGE INTO s.act_pack C USING((SELECT A.jid, A.pid, B.pcode, 
B.mc, A.md, A.hd FROM s.act_pack A INNER JOIN s.act_pack B 
ON A.pid = B.pid AND A.pcode = B.mc AND (A.hd <> B.hd 
OR A.md<> B.md)) order by  A.upd_ts desc) D  ON(C.pid = D.pid AND 
C.pcode = D.pcode AND C.jid = D.jid) WHEN MATCHED THEN UPDATE SET C.md = 
D.md, C.hd= D.hd;

我在网上看到一些论坛说 postgres 不支持合并,并使用 INSERT ... ON CONFLICT 但是没有 postgres 的背景,我无法理解如何使用它来编写这个复杂的查询。

还有人说postgres9.5及以上支持merge语句。因为我们使用 postgres 10 尝试在 postgres 中使用相同的 oracle 查询,但收到 ERROR: syntax error at or near "MERGE"

非常感谢任何帮助。

【问题讨论】:

    标签: postgresql join sql-update


    【解决方案1】:

    您不需要“UPSERT”,因为您没有执行 INSERT,因此定期更新就足够了:

    update act_pack C 
      SET C.md = D.md, 
          C.hd = D.h
    from (
      SELECT A.jid, A.pid, B.pcode, B.mc, A.md, A.hd 
      FROM s.act_pack A 
        INNER JOIN s.act_pack B 
                ON A.pid = B.pid 
               AND A.pcode = B.mc 
               AND (A.hd <> B.hd OR A.md<> B.md)
    ) d 
    where C.pid = D.pid 
      AND C.pcode = D.pcode 
      AND C.jid = D.jid
    

    这是对您的代码的直接“翻译”。但是同一张表被使用了 3 次就有点奇怪了。但如果没有更多信息,就很难知道究竟在哪里可以提高效率。

    【讨论】:

    • 我们有一张表,其中一些记录有 pcode 和二级代码。表示 pcode 列具有值“dfuk”,相应的二级代码“ukhg”位于每行的 mc 列名称中。某些行将没有主要的辅助链接。但是我们只需要检查那些具有主要辅助链接的记录,并为那些具有 md 值的行更新相应行的 hd 列。
    猜你喜欢
    • 1970-01-01
    • 2019-02-21
    • 1970-01-01
    • 1970-01-01
    • 2011-07-10
    • 2018-05-22
    • 2023-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多