Как скопировать значения из таблицы A в B и вставить ссылку на B в A? - PullRequest
0 голосов
/ 05 сентября 2018

Я хотел бы скопировать значения из a_table.foo в b_table.bar и вставить сгенерированные b_table.id в a_table.b_id:

WITH b_inserts AS (
  INSERT INTO b_table (bar)
  SELECT foo
  FROM a_table
  RETURNING id as b_id, a_table.id as a_id
)

UPDATE a_table
SET b_id = b_inserts.b_id
FROM b_inserts
WHERE a.id = b_inserts.a_id

http://sqlfiddle.com/#!17/13819/1

Сбой из-за того, что я не могу вернуть a_table.id из b_inserts, поскольку он не является частью вставленной строки, к которой имеет доступ RETURNING.

Есть ли способ решить эту проблему, не создавая временный столбец b_table.a_id?

1 Ответ

0 голосов
/ 05 сентября 2018

Вы можете сгенерировать сопоставление перед вставкой:

WITH a_to_b_mapping AS (
  SELECT nextval('b_table_id_seq'::regclass) b_id, foo, id AS a_id
  FROM a_table
), b_inserts AS (
  INSERT INTO b_table (id, bar)
  SELECT b_id, foo
  FROM a_to_b_mapping
  RETURNING id
)
UPDATE a_table a
SET b_id = m.b_id
FROM a_to_b_mapping m
  JOIN b_inserts i ON i.id = m.b_id
WHERE a.id = m.a_id

Обратите внимание, что вам нужно присоединиться к b_inserts в обновлении, чтобы убедиться, что вставка произойдет первой, если у вас есть внешний ключ от a_table.b_id до b.id.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...