4

次の Oracle ステートメントをPostgreSQL 9.3 データベースで使用できるMERGE有効なステートメントに変換する方法を教えてください。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);
4

3 に答える 3

1

私は今日これを実行し、これらのドキュメントを読み、最終的にドキュメントが現在アドバイスしていることを理解しているものと非常によく似たものを使用しました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 レベルで作業していたので、現時点では意味のある例を提供できません。これについては後で確認します。

私が間違っていなければ、完全に正常に動作しています。そこにはなかったが、実際にはそこに属していた主キーを作成することを強いられたと感じました。

于 2017-10-16T16:59:27.653 に答える
0

upsert は Postgres 9.3 で動作します。

例-

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);
于 2015-07-27T05:59:04.067 に答える