Завязка:
У меня есть две таблицы с исходными данными. В каждой таблице есть признак того, что строка была обработана (после записи - false).
Мне нужно брать из них данные, как-то обрабатывать, а после - записывать в таблицу (таблицы, но тут не особо важно - пусть будет одна) с рассчитанными данными, возвращать результат клиенту, а так же изменять признак обработки строк в первых двух таблицах (естественно, нужно откатываться при проблемах).
Если не брать в расчёт обновление и добавление данных в таблицы - будет как-то так:
with t1 as (
--первая таблица с данными
select * from table1
where "IsProcessed"=false;
),t2 as (
--вторая таблица с данными
select * from table2;
where "IsProcessed"=false;
)
--здесь происходит обработка данных (джойны и другое интересное)
, result as (
--здесь уже результат
)
select * from result;
суть:
Насколько плохо будет запихнуть апдейты и инсерты в cte? Как я понял из
доков - так делать можно:
with t1 as (
--первая таблица с данными
select * from table1
where "IsProcessed"=false;
),t2 as (
--вторая таблица с данными
select * from table2;
where "IsProcessed"=false;
)
--здесь происходит обработка данных (джойны и другое интересное)
, result as (
--здесь уже результат
),upd1 as(
update table1
set "IsProcessed"=true
from
t1
where t1.id=table1.id
),upd2 as(
update table2
set "IsProcessed"=true
from
t2
where t2.id=table2.id
),ins1 as(
insert into result_table
select from result
)
select * from result
Если это совсем плохо - как сделать лучше?
upd: дополнил последний блок кода, чтобы избежать неоднозначностей