Задать вопрос
trandul
@trandul
Инженер-разработчик

Как получить данные и обновить записи в таблицах-источниках?

Завязка:
У меня есть две таблицы с исходными данными. В каждой таблице есть признак того, что строка была обработана (после записи - 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: дополнил последний блок кода, чтобы избежать неоднозначностей
  • Вопрос задан
  • 54 просмотра
Подписаться 1 Средний 3 комментария
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    Python-разработчик расширенный
    14 месяцев
    Далее
  • Яндекс Практикум
    Мидл фронтенд-разработчик
    5 месяцев
    Далее
  • Яндекс Практикум
    Мидл Python-разработчик
    6 месяцев
    Далее
Решения вопроса 1
@Akina
Сетевой и системный админ, SQL-программист.
Насколько плохо будет запихнуть апдейты и инсерты в cte?

Это совершенно нормальная практика в Постгрессе. Более того, она предпочтительнее любой другой техники с кучей запросов и транзакцией, потому как гарантирует полную согласованность всех изменений и минимизирует количество интерференций и блокировок. Ну и не злоупотребляйте отложенными (DEFERRED) проверками - они, конечно, ускоряют, но будет обидно сделать всё, и лишь при финальном контроле свалиться по ошибке проверки.

Хотя именно для показанного шаблона (один UPDATE, и нужно получить обновлённые записи) я не понимаю, почему просто не сделать финальный апдейт внешним запросом с использованием кляузы RETURNING. Ваш финальный select * from result смотрится совершенно бессмысленной нашлёпкой.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы