首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Oracle语句迁移到PostgreSQL UPSERT语句

将Oracle语句迁移到PostgreSQL UPSERT语句
EN

Stack Overflow用户
提问于 2013-10-16 05:10:20
回答 3查看 6.8K关注 0票数 4

请帮助我将下面的Oracle9.3语句转换为一个有效的MERGE语句,以便在PostgreSQL 9.3数据库中使用。

代码语言:javascript
复制
MERGE INTO my_table a
     USING (SELECT v_c1 key,
                   v_c2 AS pkey,
                   v_c3 AS wcount,
                   v_c4 AS dcount
              FROM DUAL) b
        ON (    a.key = b.key
            AND a.pkey = b.pkey
WHEN MATCHED
THEN
   UPDATE SET wcount = b.wcount,
              dcount = b.dcount
WHEN NOT MATCHED
THEN
   INSERT     (key,
               pkey,
               wcount,
               dcount)
    VALUES(b.key,b.pkey,b.wcount,b.dcount);
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-10-16 08:06:54

我认为在PostgreSQL 9.3中没有UPSERT语句,但是您可以这样做:

代码语言:javascript
复制
with cte_dual as (
    select
        v_c1 as key,
        v_c2 as pkey,
        v_c3 as wcount,
        v_c4 as dcount
), cte_update as (
    update my_table as a set
        wcount = b.wcount,
        dcount = b.dcount
    from cte_dual as b
    where b.key = a.key and b.pkey = a.pkey
    returning *
)
insert into my_table (key, pkey, wcount, dcount)
select d.key, d.pkey, d.wcount, d.dcount
from cte_dual as d
where not exists (select * from cte_update as u WHERE u.key = d.key and u.pkey = d.pkey)

你可以阅读几个类似的问题:

票数 4
EN

Stack Overflow用户

发布于 2017-10-16 16:59:27

我今天讲了这篇文章,阅读了这些文档,最终使用了一些非常类似于我所理解的文档现在对UPSERT的建议。

代码语言:javascript
复制
INSERT INTO table (
    $INSERT_COLUMN_NAMES
)
VALUES (
    $INSERT_COLUMN_VALUES
)
ON CONFLICT (
    $LIST_OF_PRIMARY_KEY_COLUMN_NAMES
)
DO UPDATE SET
    $UPDATE_SET_SUBCLAUSE
WHERE 
    $WHERE_CONDITION_ON_PRIMARY_KEYS
;

我实际上是在DAO级别上工作,所以目前我无法提供一个有意义的例子,稍后将对此进行回顾。

如果我没搞错的话,工作也很顺利。我觉得我不得不创建一个不存在但实际上属于那里的主键。

票数 1
EN

Stack Overflow用户

发布于 2015-07-27 05:59:04

在Postgres 9.3中的作品,

例子-

代码语言:javascript
复制
WITH upsert as
 (update mytable2 m set sales=m.sales+d.sales, status=d.status from mytable d where m.pid=d.pid
 RETURNING m.*
)
insert into mytable2 select a.pid, a.sales,'NEW' from mytable a where a.pid not in (select b.pid from mytable2 b);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19395690

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档