Использовать объявленную переменную табличного типа для вставки postgres

У меня есть таблица, из которой я выбираю идентификаторы:

SELECT  Ids
FROM    C 
WHERE  C.Type = 6

Затем у меня есть много вставок с одинаковыми идентификаторами:

    INSERT INTO D (x, y, z)
    SELECT 20 as x, 2.90 as y, z FROM C WHERE Ids in (1, 2, 3, 4, 5, 6);

    INSERT INTO D (x, y, z)
    SELECT 11 as x, 33 as y, z FROM C WHERE Ids in (1, 2, 3, 4, 5, 6);

    INSERT INTO D (x, y, z)
    SELECT 12 as x, 2.11 as y, z FROM C WHERE Ids in (1, 2, 3, 4, 5, 6);

поскольку эти идентификаторы одинаковы, я хочу как-то его оптимизировать / сделать более читабельным, чтобы я не копировал и вставлял все эти идентификаторы (их несколько сотен). По этой причине я хотел бы объявить переменную типа таблицы, вставить эти идентификаторы в эту таблицу и при созданииINSERTS выберите эти идентификаторы из этой таблицы. Однако я здесь новичок и действительно не понимаю, как мне это делать, и все примеры, которые я нахожу, кажутся сложными. Может ли кто-нибудь протянуть здесь руку помощи?

Источник
Codelisting
за 1 против
Лучший ответ

Как насчет того, чтобы сделать все вставки в одном операторе?

INSERT INTO D (x, y, z)
    SELECT v.x, v.y, c.z
    FROM C CROSS JOIN
         (VALUES (20, 2.9), (11, 33), (12, 2.11)
         ) v(x, y)
    WHERE Ids in (1, 2, 3, 4, 5, 6);

Вы также можете определить идентификаторы в CTE, а затем выполнить всеinserts в одном заявлении:

with ids(id) as (
      values (1, 2, 3, 4, 5, 6)
     )
insert into d (x, y, z)
    select 20, 2.9, c.z
    from c
    where c.id in (select id from ids)
    union all
    select 11, 33, c.z
    from c
    where c.id in (select id from ids)
    union all
    . . . ;
Codelisting
Популярные категории
На заметку программисту