2017-11-18 16 views
0

複数の行を挿入または更新するための純粋なSQLクエリが必要です。私は1つの作業を始めたが、単一の行のために:複数の行に挿入しない場合の結合更新

WITH UPDATED_ITEMS as (
    UPDATE table SET (columnC, columnD) = ($value3, $value4) WHERE id = $value5 returning * 
) 
INSERT INTO table (columnA, columnB, columnC, columnD) SELECT $value1, $value2, $value3, $value4 WHERE NOT EXISTS (SELECT * FROM updated_items) 

今私は、更新条件を変更しているが、挿入でそれを行う方法がわからない:

WITH updated_items as (
    UPDATE table as m SET 
    columnC = c.columnC 
    columnD = c.columnD 
from (values ($value3, $value4, $value5), ($value8, $value9, $value10) 
) as c(columnC, columnD, id) 
where c.id::int4 = m.id returning * 
) 
INSERT INTO table (columnA, columnB, columnC, columnD) 
SELECT ($value1, $value2, $value3, $value4, $value5), ($value6, $value7, $value8, $value9, $value10) WHERE NOT EXISTS (SELECT * FROM updated_items) 

しかし、挿入部動作しません。誰でも助けてください?

+0

代わりに 'insert on conflict'を使わないのはなぜですか? –

+0

矛盾している列がシリアルのIDであれば使用できますか? – mjarmoc

答えて

0

私は基本的にnot existsに相関節が必要だと思います。あなたのアップデートはidの列を参照しているので、これも追加しました。だから私はこれがあなたが望むことをすると思う:

WITH updated_items as (
    UPDATE table as m 
    SET columnC = c.columnC, 
     columnD = c.columnD 
    FROM (VALUES ($value3, $value4, $value5), 
       ($value8, $value9, $value10) 
     ) as c(columnC, columnD, id) 
    WHERE c.id::int4 = m.id 
    RETURNING * 
    ) 
INSERT INTO table (columnA, columnB, columnC, columnD) 
    SELECT columnA, columnB, columnC, columnD 
    FROM (VALUES ($value1, $value2, $value3, $value4, $value5), 
       ($value6, $value7, $value8, $value9, $value10) 
     ) c(columnA, columnB, columnC, columnD, id) 
    WHERE NOT EXISTS (SELECT 1 FROM updated_items ui WHERE ui.id = c.id::int); 
+0

シリアルIDの作成に依存しているため、INSERTにはIDがありません。最後の$ value5、$ value10、およびc(id)を削除し、最後に存在しない場合(SELECT 1 FROM updated_items); 「INSERTに式より多くのターゲット列があります」というエラーが表示される) – mjarmoc

+0

@mjarmoc 。 。値は 'insert'と' update'で同じで、 'update'は' id'を参照しています。 –

+0

いいえ、私は4つの列にわずか4つのパラメータを挿入しているためです。 INSERT IDは1)データベース上でシリアルであるため、2)新しい行を保存している場合はIDがありません。私がdbに送るリクエストは、db ID(更新)またはnull(挿入)の$ value5として存在します。 – mjarmoc

関連する問題