我尝试在 Postgres 16.2 中使用 MERGE 语句,您可以找到下面的示例:
MERGE INTO schema1.target_table AS t
USING schema2.source_table AS s
ON t.id = s.id
WHEN MATCHED THEN
UPDATE SET
data1 = s.data1,
data2 = s.data2
WHEN NOT MATCHED BY TARGET
INSERT (id, data1, data2,)
VALUES (s.id, s.data1, s.data2)
WHEN NOT MATCHED BY SOURCE
DELETE;
在尝试这个查询时,我发现Postgres从版本15开始就支持MERGE语句,但它不支持“BY TARGET”或“BY SOURCE”语句,抛出这个错误:
SyntaxError: syntax error at or near "BY"
LINE 8: WHEN NOT MATCHED BY TARGET
在寻找更清洁的替代方案以达到相同结果时,我遇到了这个有用但旧的答案。虽然它工作得很好,但我发现它理解起来有点复杂,并且宁愿避免它以保持我的代码尽可能干净。
您知道有什么方法可以以更干净的方式达到相同的结果吗?
with cte as (
delete from schema1.target_table
where id not in (select id from schema2.source_table) )
insert into schema1.target_table
table schema2.source_table
on conflict(id) do update set data1=excluded.data1,
data2=excluded.data2;
原理仍然完全相同:这是一个老式的 PostgreSQL upsert,用 CTE 来填充 Ms SQL Server 中发现的
非标准
WHEN NOT MATCHED BY SOURCE
扩展。