0

CTEの行を挿入(または競合時に更新)しようとしましたが、正しい構文を見つけるのに苦労しています。 (明瞭にするために簡素化された)私はこのようなルックスに挿入していますテーブルはpostgresql 9.5でWITH問合せのINSERT ON CONFLICT UPDATEが可能ですか?

 Column  |   Type   |       Modifiers 
----------------------+--------------------------+------------------------------------------------------------------ 
id     | integer     | not null default nextval('"QuestionStatistic_id_seq"'::regclass) 
questionId   | integer     | 
count    | integer     | not null default 0 
Indexes: 
    "QuestionStatistic_pkey" PRIMARY KEY, btree (id) 
    "QuestionStatistic_questionId_key" UNIQUE CONSTRAINT, btree ("questionId") 

は、これが私のクエリです:SET "count" = "Statistics"."count"部分で私ERROR: missing FROM-clause entry for table "Statistics"を与える

with "Statistic" as (
    select "questionId", "count" from "SomeTable" 
) 
INSERT INTO "QuestionStatistic" ("questionId", "count") SELECT "questionId", "count" FROM "Statistics" 
ON CONFLICT ("questionId") DO UPDATE SET "count" = "Statistics"."count" 

。 FROMをupdate節に追加しようとしましたが、ERROR: syntax error at or near "FROM"があります。 INSERT ON CONFLICT UPDATEをCTEと連携させる方法はありますか? ON CONFLICT DO UPDATE

+1

は、多分あなたは '使うべきexcluded.count' ..あなたは、反復サンドボックスを共有してくださいだろう.. –

+0

@VaoTsunのおかげで、使用して "除外" テーブル名だけで動作して?細かい – fourslashw

答えて

2

https://www.postgresql.org/docs/9.5/static/sql-insert.html

SETWHERE句は、テーブルの名前(またはエイリアス)を使用して既存の行にアクセスする必要があり、そして行に特別excludedテーブルを使用して挿入するために提案されています。これ

してみてください:

with "Statistic" as (
    select "questionId", "count" from "SomeTable" 
) 
INSERT INTO "QuestionStatistic" ("questionId", "count") 
SELECT "questionId", "count" FROM "Statistics" 
ON CONFLICT ("questionId") DO UPDATE 
SET "count" = excluded."count" 
関連する問題