【问题标题】:SQL Server MERGE statement in Postgresql?Postgresql中的SQL Server MERGE语句?
【发布时间】:2021-06-23 14:44:05
【问题描述】:
merge into Mytable WITH (HOLDLOCK) as dst
                    using (select @mId as MId,  
                        @up as UP, 
                        @termsAccepted as TermsAccepted, 
                        @AnalyticsAccepted as AnalyticsAccepted, 
                        @EssentialCookiesPolicyWasAccepted as EssentialAccepted,

                    ) as src on dst.MId = src.MId and dst.UP = src.UP
                when matched then 
                    update set dst.TermsAccepted = src.TermsAccepted,
                        dst.AnalyticsAccepted = src.AnalyticsAccepted,
                        dst.EssentialAccepted = src.EssentialAccepted,

                when not matched then
                    insert(MId, UP ) 
                    values(src.MId, src.UP)

试图将其转换为 postgres 但似乎无法找到原因语法替换合并?

尝试了递归查询,但对要走多远有点迷茫?

WITH f AS (
select mId as MId,  
up as UP, 
) as src on dst.MId = src.MId and dst.UP = src.UP
)
INSERT INTO myTable (MId, UP) 
SELECT src.MId, src.UP
FROM src
WHERE NOT EXISTS (
insert(MId, UP ) 
values(src.MId, src.UP)
                           

【问题讨论】:

  • 关于 Postgres 9.5+ "INSERT ON CONFLICT (key) DO UPDATE...` 的良好答案 here 插入语法应该可以替代 sql server 中的 MERGE
  • 谢谢,我用过 insert into 但我似乎无法理解它的递归部分。仍在工作中
  • 我认为这里不需要递归。您正在根据键从一个表/结果集更新/合并到另一个表中。不管是UPSERTMERGEINSERT INTO ... ON DUPLICATE KEY...INSERT INTO ... ON CONFLICT...,这或多或少都是一个sql语法问题。
  • 我不太明白你的意思,你能举个例子吗?

标签: sql postgresql upsert sql-merge


【解决方案1】:

不确定 Microsoft SQL Server 语句的确切作用,但您可以尝试以下操作:

INSERT INTO mytable (mid, up) VALUES ($1, $2)
ON CONFLICT (mid, up)
DO UPDATE SET mid = EXCLUDED.mid, up = EXCLUDED.up;

这需要对 (mid, up) 的唯一约束。

您问题中UPDATE 分支中的列有不同的名称,但这对我来说没有任何意义。必要时更换细节!

【讨论】:

  • 抱歉,有一点不正确的副本并过去了。修复了添加了正确的列
  • 好的,现在明白了。只需使用实际的列名而不是我的答案中的列名。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-28
  • 2020-10-13
  • 1970-01-01
  • 2011-09-03
  • 1970-01-01
  • 2016-11-30
相关资源
最近更新 更多