Как запустить две отдельные инструкции INSERT INTO с помощью одной С в PostgreSQL

#sql #postgresql

Вопрос:

Я хочу получить данные один раз в начале транзакции с WITH помощью оператора, а затем разделить эти данные на еще два WITH оператора, которые я могу использовать для создания двух INSERT INTO операторов.

Выглядит так:

 BEGIN;

WITH data AS (...),
data1 AS (SELECT * FROM data ...),
data2 AS (SELECT * FROM data ...);

INSERT INTO table1 (...) (...);
INSERT INTO table2 (...) (...);

COMMIT;
 

Я понимаю, что есть синтаксическая ошибка с ; после моих WITH утверждений, и когда я удаляю ее, она говорит data2 , что ее не существует…

Как я могу добиться своего предполагаемого поведения?

Ответ №1:

Просто используйте CTEs:

 WITH data AS (...),
     data1 AS (SELECT * FROM data ...),
     data2 AS (SELECT * FROM data ...),
     i as (INSERT INTO table1 (...) (...))
INSERT INTO table2 (...) (...);
 

Postgres разрешает insert / update / delete в CTE (хотя они обычно используются RETURNING для возврата затронутых строк).

Ответ №2:

По какой причине вам нужно делать это параллельно?

 BEGIN;

WITH data AS (...),
data1 AS (SELECT * FROM data ...),
data2 AS (SELECT * FROM data ...)
INSERT INTO table1 (...) (...);

WITH data AS (...),
data1 AS (SELECT * FROM data ...),
data2 AS (SELECT * FROM data ...)
INSERT INTO table2 (...) (...);

COMMIT;
 

Если это неприемлемо по соображениям производительности, то, возможно, есть некоторые общие варианты проектирования БД, которые вам следует пересмотреть/создать виртуальную таблицу, которая может справиться с этим.