Мне нужна идея, как извлечь лес записей, используя рекурсивный запрос WITH .. RECURSIVE в PostgreSql. Структура данных примерно выглядит как
create table rule ( id int primary key, obj_id int, start_time timestamp )
Мне нужно извлечь все цепочки правил для каждого объекта и пересчитать start_time для каждой i-й записи, когда i-я запись функционально зависит от предыдущей записи. Вот так мне нужен рекурсивный запрос. У меня есть идея, как извлечь один список, это выглядит как
with recursive rq (
select id, obj_id, start_time, id as prev from rule where id = :some_value
union all
select q.*
from (select id, obj_id, t, lead(r.id) over (order by start_time) as prev) q
join rq on rq.prev = q.id
)
и дает последовательность вроде
(root(A)) -> (rule1) -> (rule2) -> ...
но мне нужен список для каждого объекта:
(root(A)) -> (rule1) -> (rule2) -> ...
(root(B)) -> (rule1) -> (rule2) -> ...
...
(root(N)) -> (rule1) -> (rule2) -> ...
или
object1|rule1
object1|rule2
...
object2|rule1
object2|rule2
...
и вот я полностью застрял. Я прочитал несколько примеров с деревьями и списками, но они обычно работают с одной корневой записью. Есть ли возможный способ сделать трюк с несколькими корнями? Может быть, мне нужно извлечь весь набор записей в нерекурсивной части, а затем соединить его с собой, пересчитывая поле start_time? Есть еще идеи?