将 Oracle upsert 转换为 PostgreSQL 准备好的语句

Posted

技术标签:

【中文标题】将 Oracle upsert 转换为 PostgreSQL 准备好的语句【英文标题】:Converting Oracle upsert to PostgreSQL prepared statement 【发布时间】:2021-08-19 07:26:51 【问题描述】:

我想将 upsert 查询从 Oracle DB 迁移到 PostgreSQL。下面显示了一个 Oracle 准备好的语句,它从对偶表中获取值并对 DUMMY 表执行 upsert 操作。

MERGE INTO DUMMY a
USING (SELECT ? ID,
              ? NAME,
              ? SIZE from dual) b
ON (a.ID = b.ID)
WHEN MATCHED THEN
    UPDATE
    SET a.ID = b.ID,
        a.NAME = b.NAME,
        a.SIZE = b.SIZE
WHEN NOT MATCHED THEN
    INSERT(a.ID,
           a.NAME,
           a.SIZE)
    VALUES ( b.ID,
             b.NAME,
             b.SIZE)

我想使用 dual 将其转换为 PostgreSQL。下面是我的 PostgreSQL 尝试,但我不能在 using 语句中使用 select 语句。你能指出问题出在哪里吗?

INSERT INTO DUMMY(id,name,size)
values (SELECT ? id,
               ? name,
               ? size from dual) b
ON conflict(id)
do UPDATE
    SET a.id= b.id,
        a.name=b.name,
        a.size=b.size;

【问题讨论】:

【参考方案1】:

不需要值的别名。您可以使用 excluded 关键字引用这些值:

INSERT INTO DUMMY(id,name,size)
values (?, ?, ?)
ON conflict(id)
do UPDATE
    SET name = excluded.name,
        size = excluded.size;

请注意,我删除了 ID 列的更新,因为它没有用,因为根据定义,新值必须与现有值相同。

【讨论】:

你知道这个***.com/questions/69203390/…吗?

以上是关于将 Oracle upsert 转换为 PostgreSQL 准备好的语句的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 DATAX 以 UPSERT 语义更新下游 ORACLE 数据库中的数据?

Exasol UPSERT 不使用第二张桌子?

在Salesforce中Upsert批量与批量Upsert

oracle 将字符型转换为数值型

不能对现有成员使用 upsert

将 Oracle 的数字转换为字节,然后转换为值 + 指数