#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;
Если это неприемлемо по соображениям производительности, то, возможно, есть некоторые общие варианты проектирования БД, которые вам следует пересмотреть/создать виртуальную таблицу, которая может справиться с этим.