【问题标题】:merge in Postgres - using insert on conflict在 Postgres 中合并 - 在冲突中使用插入
【发布时间】:2020-05-13 16:23:57
【问题描述】:

我正在尝试使用合并运算符执行 upsert,很快意识到 postgres 没有像 SQL Server 一样的合并语句,并且多个帖子指的是“插入冲突”语句而不是模拟。

尝试在 postgresSQL 中模拟以下内容 - 请您帮忙,因为我没有看到任何示例:

MERGE target_table USING source_table
ON merge_condition
WHEN MATCHED
    THEN update_statement
WHEN NOT MATCHED
    THEN insert_statement
WHEN NOT MATCHED BY SOURCE
    THEN DELETE;

我有以下数据集 - 请您指出如何在 postgres 中使用“冲突插入”来执行此操作 或任何其他方式;

TabA
==============
id   |  Val
------------
1    | 20     
3    | 30          
5    | 30 

TabB

id   |  Val
------------
3    | 40          
6    | 50           

【问题讨论】:

    标签: sql postgresql merge


    【解决方案1】:

    Postgres 不支持合并。它确实有一个有限的on conflict。它仅限于绕过语句或更新指定的列。 此外,它没有使用提供的合并的独立选择,但这可以通过 CTE 模拟。
    您没有描述您想要做什么,也没有描述 TabA 或 TabB 的用法,也没有描述所需的内容。 e.请从样本数据中提供任务描述、实际表定义和期望的实际结果。
    如果没有具体的参考资料,我无法给出实质性的查询,但格式似乎是:

    with CTE as (select column_list from source_table)  
    insert into target_table(column_list)
      select column_list from CTE
      on conflict on ... 
      do update
           set column_name = excluded.column_name
             , column_name = excluded.column_name , ...;  
    

    我不知道“WHEN NOT MATCHED BY SOURCE”在 Sql Server 中的作用。它确实看起来可能与 Oracle 的“合并......当匹配删除位置”构造相同。遗憾的是 Postgres 没有提供相应的能力。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-07
      • 1970-01-01
      • 2017-04-03
      • 1970-01-01
      • 1970-01-01
      • 2018-03-28
      • 2021-04-23
      相关资源
      最近更新 更多