Я новичок в WITH RECURSIVE
в PostgreSQL. У меня есть достаточно стандартный рекурсивный запрос, следующий за списком смежности. Если у меня есть, например:С запросом RECURSIVE, чтобы выбрать самые длинные пути
1 -> 2
2 -> 3
3 -> 4
3 -> 5
5 -> 6
производит:
1
1,2
1,2,3
1,2,3,4
1,2,3,5
1,2,3,5,6
То, что я хотел бы, чтобы иметь только:
1,2,3,4
1,2,3,5,6
Но я не могу видеть, как это сделать в Postgres. Казалось бы, это «выбрать самые длинные пути» или «выбрать пути, которые не содержатся в другом пути». Вероятно, я могу увидеть, как это сделать с присоединением к себе, но это кажется довольно неэффективным.
Пример запроса:
WITH RECURSIVE search_graph(id, link, data, depth, path, cycle) AS (
SELECT g.id, g.link, g.data, 1, ARRAY[g.id], false
FROM graph g
UNION ALL
SELECT g.id, g.link, g.data, sg.depth + 1, path || g.id, g.id = ANY(path)
FROM graph g, search_graph sg
WHERE g.id = sg.link AND NOT cycle
)
SELECT * FROM search_graph;
Поиск номеров, не имеющих детей.Постройте из найденных бездетных номеров вверх. –
BTW: ваш предполагаемый выход '1,2,3,4 | 1,2,3,5,6' * не могут * существуют, поскольку каждый узел имеет только одно поле 'link' и, следовательно, только один преемник. («3» имеет как «4», так и «5» в качестве преемников. – wildplasser
Глупый пользовательский интерфейс: я обрезал и отметил, что комментарий Эрвинса оскорбителен :-) – wildplasser