Есть ли простой способ выбрать корневой узел поддерева (PostgreSQL ltree) из запроса, который возвращает (потенциально) несколько узлов-потомков того же поддерева ? Я выполнил довольно подробный алгоритм для достижения задачи (~ 40 строк, отступов и отформатированных), но было бы здорово, если бы я мог использовать тот факт, что данные на основе данных являются фактически деревьями и имеют легкодоступный корневой узел. Важно отметить, что несколько отдельных корней поддерева могут быть возвращены из одного запроса, поэтому я не могу просто сортировать данные и захватывать верхний результат.Выбор корневого узла из запроса поддерева (PostgreSQL ltree), который возвращает несколько потомков
07 июня 2012 г. Я обновил запрос до последней версии, которая сокращает временную сложность пополам. Он использует самоподдерживающееся (если хотите) удаление всех узлов из поддерева, у которых есть предки в поддереве.
По сути, мой алгоритм работает следующим образом:
WITH roots AS
(
/* Place any query here, which returns a field "ancestry" of type ltree */
)
SELECT roots.*
FROM roots
WHERE NOT EXISTS
(
SELECT 1
FROM roots AS ancestors
WHERE ancestors.ancestry @> roots.ancestry
AND ancestors.id <> roots.id
);
(для получения более подробной информации, пожалуйста, смотрите мою суть, здесь: https://gist.github.com/1507368)
Я использую версию 9.1.2 – Dylon
Ваш вопрос противоречив. Вы хотите определить (один) корневой узел, утверждая, что существует «несколько, разных корней поддерева». И в то же время? –
Это не противоречит, см. Мой сущность, здесь: https://gist.github.com/1507368 – Dylon