2013-10-16 63 views
2

您能否帮助我将以下Oracle MERGE语句转换为有效的UPSERT语句以用于PostgreSQL 9.3数据库?将Oracle MERGE语句迁移到PostgreSQL UPSERT语句

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); 

回答

2

我不认为有一个在PostgreSQL的9.3 UPSERT语句,但你可以这样做:

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) 

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

+0

它抱怨错误:关系“双”不存在位置:301 – gpa

0

了在Postgres 9.3 UPSERT工作,

例 -

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

我跑这今天,读到这些,在文档,最终用过的东西非常相似,我的理解文档现在建议的UPSERT

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层面的工作,所以我不能在瞬间提供一个有意义的例子,稍后会检讨。

如果我没有弄错,工作完全正常。我感到被迫创造了一个不在那里但实际上属于那里的主钥匙。