закрыто: идея, как извлечь лес с рекурсивным запросом SQL - PullRequest
2 голосов
/ 19 марта 2011

Мне нужна идея, как извлечь лес записей, используя рекурсивный запрос 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? Есть еще идеи?

1 Ответ

1 голос
/ 31 марта 2011

Почему бы сначала не выбрать все корни, а затем использовать опцию with recursive для заполнения леса?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...