Вопрос

У меня есть иерархическая база данных 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
                  )
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top