использование CTE для update, insert,delete

Здравствуйте.
PostgreSQL 9.1.6
Помогите именно запросом в первую очередь решить следующую задачу.
Есть резервная таблица reserv и рабочая table.
Необходимо восстановить данные из таблицы reserv в table по следующему алгоритму:

1. Выбираем данные из резервной таблицы reserv, которые необходимо восстановить.
2. Вставляем полученный набор в рабочую таблицу table.
3. Помечаем у вставленного набора в рабочей таблице поле date_end в null.

Делаю следующее:

--1.Формирую данные из резервной таблицы reserv, которые необходимо восстановить
-- (представление укорочено для наглядности)
with
nabor as (
select
reserv.id
,reserv.date_end
from
reserv
)

-- Продолжение запроса Вариант I
,inserting as (
insert into table select * from nabor
returning id
)
,marking as (
update table set date_end=null where id in (select id from inserting)
returning id
)
select * from marking

В этом варианте подразумевается последовательный (как бы вложенный) вызов каждого из
пунктов алгоритма, начиная с последнего (третьего).
При этом inserting отрабатывает, а marking - нет (Ошибок нет - пишется 0 строк обработано)
если поменять вызовы inserting и marking местами, то - наоборот .(работает как бы только 1-ый
уровень "вложенности")
при аналогичной вложенности с select'ами (в других запросах с использованием т.н. CTE) все
работает - проверено.

-- Продолжение запроса Вариант II
update table set date_end=null where id in (insert into table select * from nabor returning id)
--
синтаксическая ошибка(не пойму в чем дело)

-- Продолжение запроса Вариант III
,inserting as (
insert into table select * from nabor
returning id
)
,marking as (
update table set date_end=null where id in (select id from nabor)
returning id
)
select * from inserting
union all
select * from marking

выполняются одновременно, а хотелось бы последовательно

Подскажите что не так в каждом из представленных вариантов. Интересует по большой части только I и II варианты.
Касаемо III варианта, видимо так PostgreSQL работает (что в принципе может быть и в I и II случаях).
Как вообще реализовать такую задачу именно запросом.

Back to top

(С) Виктор Вислобоков, 2008-2023