如何对 postgresql 中具有联合的查询进行更新?

Posted

技术标签:

【中文标题】如何对 postgresql 中具有联合的查询进行更新?【英文标题】:How to do an update on a query having union in postgrsql? 【发布时间】:2021-03-26 05:38:23 【问题描述】:

我有 2 个表名为 test 和 test_snapshop。在测试表中我正在保存当前数据,在 test_snapshot 中我正在保存旧数据。现在我需要对一些 id 值进行更新。有可能一些 id 存在于测试中,而另一些存在于快照表中。

我试过这样

update test 
  set column1=value,
      column2=value,
      column3=value 
where column4 in(1,2,3)
union
update test_snapshot 
  set  column1=value,
       column2=value,
       column3=value 
where column4 in(1,2,3)

两个表的列号和名称相同。

上述查询与预期不符。我在这个查询中做错了什么。任何人都可以帮助我。

我是 postgresql 新手。

【问题讨论】:

只需运行两次更新。 UPDATE 不支持 UNION,这里也不需要。 与您的问题无关,但是:Postgres 9.2 是no longer supported,您应该尽快计划升级。 我投票结束是一个错字。 union 是一个错字。只需运行两个单独的语句。 【参考方案1】:

虽然我投票关闭是一个错字,但您可以在 Postgres 中使用单个语句来表达这一点。我可能会去:

with ids as (
      select *
      from (values (1), (2), (3)) v(id)
     ),
     t as (
      update test 
          set column1 = value,
              column2 = value,
              column3 = value 
          where column4 in (select i.id from ids i)
     )
update test_snapshot 
    set column1 = value,
        column2 = value,
        column3 = value 
     where column4 in (select i.id from ids i);

使用这种结构,您只需要列出一次 id 值。

【讨论】:

以上是关于如何对 postgresql 中具有联合的查询进行更新?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用单个查询联合从另一个表中检索到的表列表?

从具有交集和联合但也具有其他独特属性的两个表中进行 SQL 查询

PostgreSQL 中具有特定模式的 Linq 和实体迁移

如何对 PostgreSQL 架构内的表进行选择查询? [复制]

BigQuery:对具有不同字段顺序的重复字段进行联合

如何在 PostgreSQL JSONB 列中查询具有异构元素的嵌套数组