从选择中插入具有不同值的多行

Raf*_*rro 4 postgresql

我有以下表格ProjectsProjectFields. 我试图用另一个值加上一些其他值来填充一个,这样:

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.
Run Code Online (Sandbox Code Playgroud)

这个想法是每个项目都必须在ProjectFields表中具有三个引用字段。我知道上面的代码不起作用,有什么方法可以使用PostgreSQL吗?

如果您有更好的想法,请告诉我,谢谢。

Mic*_*zzi 5

您快到了!只需使用UNIONvoilá

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");
Run Code Online (Sandbox Code Playgroud)