Как мне запросить все узлы между двумя узлами в дереве?
Вопрос
У меня есть иерархическая база данных Strucutre, например, столбцы ID
и PARENT_ID
определяется для каждой строки, с рядами верхнего уровня, имеющего NULL PARENT_ID
.
У меня все отношения из этой таблицы сглажены в другую таблицу, например, если в одной иерархии дедушка были три записи, родитель, внук, там будет 3 записи:
**ANCESTOR, DESCENDANT**
grantparent, parent
grandparent, grandchild
parent, grandchild
Вместо того, чтобы выполнить иерархический запрос, чтобы определить, что внук является потомком дедушка, я могу просто проверить наличие существования (grandparent, grandchild)
Запись в этой сплющенной таблице.
Мой вопрос, используя эту сплющенную таблицу, как я могу наиболее эффективно вернуть все записи, которые находятся между двумя узлами. Используя пример, с grandparent
и grandchild
Как мои параметры, как я могу вернуть (grandparent, parent)
записывать.
Я не хочу использовать иерархический запрос, чтобы решить это ... Мне интересно, можно ли это сделать без каких-либо соединений.
Решение
SELECT *
FROM mytable
WHERE descendant = @descendant
AND hops <
(
SELECT hops
FROM mytable
WHERE descendant = @descendant
AND ancestor = @ancestor
)
Это автоматически позаботится о случаях, когда @ancestor
не совсем @descendant
предки.
Создать указатель на (descendant, hops)
Для этого быстро работать.
Другие советы
Пытаться:
select h1.descendant intermediate_node
from hierarchy h0
join hierarchy h1
on h0.ancestor = h1.ancestor
and h0.hops > h1.hops -- redundant condition, but may improve performance
join hierarchy h2
on h1.ancestor = h2.ancestor
and h0.descendant = h2.descendant
where h0.ancestor = :ancestor and h0.descendant = :descendant
SELECT
distinct ancestor
FROM
hierarchy
WHERE descendant = :1 AND
ancestor IN (
SELECT
distinct descendant
FROM
hierarchy WHERE ancestor = :2
)