Вы можете просмотреть результаты запроса, как показано в @phatfingers (возможно, с общей record
или скалярной переменной вместо rowtype
, если тип результата запроса не соответствует ни одному из существующих типов строк).Это хорошая идея для нескольких результирующих строк или когда необходима последовательная обработка .
Для больших наборов результатов ваш исходный подход будет работать быстреена порядок.Гораздо дешевле сделать массовую INSERT / UPDATE / DELETE с помощью одной команды SQL, чем писать / удалять постепенно, по одной строке за раз.
A временная таблица - это то, что нужноповторное использование таких результатов.Он сбрасывается автоматически в конце сеанса.Вам нужно только явно удалить, если вы хотите избавиться от него сразу или в конце транзакции.Я цитирую руководство здесь :
Временные таблицы автоматически удаляются в конце сеанса или, возможно, в конце текущей транзакции.
Для больших временных таблиц было бы неплохо запустить ANALYZE
после их заполнения.
Записываемый CTE
Вот демонстрация того, что Павел добавил в своем комментарии:
CREATE TEMP TABLE t1(id serial, txt text);
INSERT INTO t1(txt)
VALUES ('foo'), ('bar'), ('baz'), ('bax');
CREATE TEMP TABLE t2(id serial, txt text);
INSERT INTO t2(txt)
VALUES ('foo2'),('bar2'),('baz2');
CREATE TEMP TABLE t3 (id serial, txt text);
WITH x AS (
UPDATE t1
SET txt = txt || '2'
WHERE txt ~~ 'ba%'
RETURNING txt
)
, y AS (
DELETE FROM t2
USING x
WHERE t2.txt = x.txt
RETURNING *
)
INSERT INTO t3
SELECT *
FROM y
RETURNING *;
Подробнее см. В главе Операции изменения данных в WITH в руководстве.