2013-10-16 2 views
2

다음 Oracle MERGE 문을 PostgreSQL 9.3 데이터베이스에서 사용할 수있는 유효한 UPSERT 문으로 변환 할 수 있습니까? 내가 거기에 PostgreSQL을 9.3에서 UPSERT 문,하지만 당신이 할 수 있다고 생각하지 않습니다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

:

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) 

당신은 유사한 질문 몇 읽을 수 있습니다

포스트 그레스 9.3에서 작동 upsert 0
+0

ERROR에 대한 불만 : 관계 "dual"이 존재하지 않습니다. Position : 301 – gpa

0

,

예 -

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 : 나는 순간에 의미있는 예제를 제공 할 수 있도록 실제로 DAO 수준에서 작동했다

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 
; 

, 나중에이 문제를 검토 할 것입니다.

내가 잘못 생각하지 않는다면 완벽하게 작동합니다. 나는 거기에 없었지만 실제로 거기에 속한 기본 키를 만들 것을 강요 받았습니다.

관련 문제