Вставить инструкцию, возвращая столбцы из исходной таблицы - PullRequest
2 голосов
/ 27 июня 2019

Для массовой вставки у меня есть внешнее ссылочное значение. Как часть вставки, я хотел бы вернуть и ссылку, и соответствующие идентификаторы вновь созданных записей, чтобы создать запись сопоставления в другой системе.

Использование «ВОЗВРАТ» прекрасно работает для целевой таблицы. Кроме создания фиктивного столбца в целевой таблице, есть ли способ достичь того, что я пытаюсь сделать?

Определенно не хочу выполнять построчную обработку.

ПРИМЕЧАНИЕ. В настоящее время используется версия 10.7

.

В моем примере кода я попытался «вернуть id, source.ref», но, очевидно, это не поддерживается.

create table test( id serial primary key, name varchar);

insert into test( name)
select source.name
from ( values('refa', 'name a'), ('refb', 'name b'), ('refc', 'name c') ) source(ref, name)
returning id --, source.ref

Ответы [ 2 ]

0 голосов
/ 27 июня 2019

Ссылка на источник, если он уникален.Попробуйте что-то вроде этого:

WITH q AS ( INSERT  INTO test (name)
              SELECT source.name
              FROM ( VALUES ('refa', 'name a'), ('refb', 'name b'), ('refc', 'name c')
                   ) AS source (ref, name)
            RETURNING * )
SELECT q.id, source.ref
FROM q
  JOIN ( VALUES ('refa', 'name a'), ('refb', 'name b'), ('refc', 'name c')
       ) AS source (ref, name) ON q.name = source.name

Но если вы хотите добавить это отображение в другую таблицу, вы можете подумать о реструктуризации ваших запросов, например:

INSERT INTO mapping ( ref, id )
  SELECT source.ref, ( INSERT INTO test (name) VALUES ( source.name ) RETURNING id )
  FROM ( VALUES ('refa', 'name a'), ('refb', 'name b'), ('refc', 'name c')
                 ) AS source (ref, name) )
0 голосов
/ 27 июня 2019

Использовать CTE:

WITH a AS (
   INSERT ...
   RETURNING ...
), b AS (
   INSERT ...
   RETURNING ...
)
SELECT ...
FROM a JOIN b ON ...
...