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