Postgresql 中的 SQL Server MERGE 语句?

问题描述

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)
                           

解决方法

不确定 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 分支中的列具有不同的名称,但这对我来说没有任何意义。根据需要替换详细信息!