在 Postgres 中实现合并功能的简洁方法,适用于目标/源不匹配的情况

问题描述 投票:0回答:1

我尝试在 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

在寻找更清洁的替代方案以达到相同结果时,我遇到了这个有用但旧的答案。虽然它工作得很好,但我发现它理解起来有点复杂,并且宁愿避免它以保持我的代码尽可能干净。

您知道有什么方法可以以更干净的方式达到相同的结果吗?

sql postgresql merge
1个回答
1
投票

您没有说关于旧查询不干净,但这里有一个替代方案:演示

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 扩展。

© www.soinside.com 2019 - 2024. All rights reserved.