【发布时间】: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 但我似乎无法理解它的递归部分。仍在工作中
-
我认为这里不需要递归。您正在根据键从一个表/结果集更新/合并到另一个表中。不管是
UPSERT,MERGE,INSERT INTO ... ON DUPLICATE KEY...INSERT INTO ... ON CONFLICT...,这或多或少都是一个sql语法问题。 -
我不太明白你的意思,你能举个例子吗?
标签: sql postgresql upsert sql-merge