Как запросить все узлы между двумя узлами в дереве? - PullRequest
2 голосов
/ 03 ноября 2010

У меня есть иерархическая структура базы данных, например, столбцы ID и PARENT_ID, определенные для каждой строки, причем строки верхнего уровня имеют NULL PARENT_ID.

. У меня все отношения из этой таблицы сглаженыв другую таблицу, например, если бы в одной иерархии деда, родителя, внука было три записи, было бы 3 записи:

**ANCESTOR, DESCENDANT**
grantparent, parent
grandparent, grandchild
parent, grandchild

Вместо выполнения иерархического запроса, чтобы определить, что внук является потомкоммоего деда я могу просто проверить наличие записи (grandparent, grandchild) в этой плоской таблице.

Мой вопрос заключается в том, как с помощью этой плоской таблицы как можно наиболее эффективно вернуть все записи, которые находятся между двумя узлами.Используя пример с grandparent и grandchild в качестве моих параметров, как я могу получить обратно запись (grandparent, parent).

Я не хочу использовать иерархический запрос для решения этой проблемы ... I 'Мне интересно, возможно ли это сделать без каких-либо объединений.

Ответы [ 3 ]

2 голосов
/ 03 ноября 2010
SELECT  *
FROM    mytable
WHERE   descendant = @descendant
        AND hops < 
        (
        SELECT  hops
        FROM    mytable
        WHERE   descendant = @descendant
                AND ancestor = @ancestor
        )

Это автоматически позаботится о случаях, когда @ancestor на самом деле не является предком @descendant.

Создайте индекс для (descendant, hops), чтобы это работало быстро.

1 голос
/ 03 ноября 2010

Попробуйте:

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
0 голосов
/ 03 ноября 2010
SELECT
   distinct ancestor 
FROM 
   hierarchy 
WHERE descendant = :1 AND 
      ancestor IN (
                    SELECT 
                       distinct descendant 
                    FROM 
                       hierarchy WHERE ancestor = :2
                  )
...