2017-11-08 14 views
2

私は以下のテーブルProjectsProjectFieldsを持っています。私は別の値に加えて、いくつかの他の値との1、この方法を移入しようとしています:選択と異なる値の複数の行を挿入

INSERT INTO "ProjectFields" ("projectId", name, type, "isDefault") 
     (SELECT "projectId", 'Notes', 'textarea', true FROM "Projects"), -- creates one field called 'Notes' for every project. 
     (SELECT "projectId", 'Bio', 'textarea', true FROM "Projects"), -- creates one field called 'Bio' for every project. 
     (SELECT "projectId", 'Photo', 'text', true FROM "Projects"); -- creates one field called 'Photo' for every project. 

アイデアは、すべてのプロジェクトがProjectFieldsテーブルで3つの参照フィールドを持たなければならないということです。上記のコードはうまくいきませんが、PostgreSQLを使ってこれを行う方法はありますか?

あなたが良いアイデアをお持ちでしたら、教えてください、ありがとうございます。

答えて

3

あなたはほぼそこにいます!ただ、出来上がりUNIONを使用します。

INSERT INTO "ProjectFields" ("projectId", name, type, "isDefault") 
     SELECT "projectId", 'Notes', 'textarea', true FROM "Projects" 
     UNION ALL 
     SELECT "projectId", 'Bio', 'textarea', true FROM "Projects" 
     UNION ALL 
     SELECT "projectId", 'Photo', 'text', true FROM "Projects"; 

--As you asked, using only one SELECT on Projects (but using a CTE) 
--But I didn't recommend this solution, why increase complexity of a query just to avoid the 3 SELECTS? 
INSERT INTO "ProjectFields" ("projectId", name, "isDefault") 
    WITH tmp (proj_id, field_name, is_default) AS (  
     SELECT "projectId", UNNEST(ARRAY['Notes','Bio', 'Photo']), true FROM "Projects" 
    ) 
    SELECT proj_id, field_name, CASE field_name WHEN 'Notes' THEN 'textarea' WHEN 'Bio' THEN 'textarea' ELSE 'text' END,is_default FROM tmp; 

--Or perhaps in a more cleaner way as stated by @Marth: 
INSERT INTO "ProjectFields" ("projectId", name, "isDefault") 
    SELECT * FROM projects, (VALUES ('notes', 'textarea'), ('bio', 'textarea'), ('Photo', 'text')) AS t(name, "type"); 
+0

を選択する代わりに、3つのみを実行する方法はありますか?もう一度@ michel.milezziありがとうございます。 –

+0

はい、それは価値がないIMHOです。私の更新された答えを見てください。よろしく! –

+0

@ michel.milezzi:あなたの "1-SELECT"ソリューションは少し複雑です。プロジェクトから選択することができます(値( 'notes'、 'textarea')、 'bio'、 'text '))をt(name、 "type") 'とします。しかし、はい、 'UNION ALL 'を使うのは、私が信じる最も一般的な解決法です(最も簡単で読みやすいものもあります)。 – Marth

関連する問題