Как Вы получаете всех предков узла с помощью SQL Server 2008 hierarchyid?

Учитывая таблицу с a hierarchyid введите столбец, как Вы пишете запрос для возврата всех строк, которые являются предками определенного узла?

Существует IsDescendantOf() функция, которая идеально подходит для получения детей, но нет никакого соответствия IsAncestorOf() функционируйте для возврата предков (и отсутствие a GetAncestors() функция походит на настоящий контроль.)

26
задан gotqn 22 July 2015 в 14:33
поделиться

1 ответ

Наиболее часто используемый подход - это рекурсивное общее табличное выражение (CTE)

WITH Ancestors(Id, [Name], AncestorId) AS
(
      SELECT
            Id, [Name], Id.GetAncestor(1)
      FROM
            dbo.HierarchyTable
      WHERE
            Name = 'Joe Blow'  -- or whatever you need to select that node

      UNION ALL

      SELECT
            ht.Id, ht.[Name], ht.Id.GetAncestor(1)
      FROM
            dbo.HierarchyTable ht
      INNER JOIN 
            Ancestors a ON ht.Id = a.AncestorId
)
SELECT *, Id.ToString() FROM Ancestors

(адаптировано из сообщения в блоге Саймона Инса )

Саймон Инс также предлагает второй подход, при котором он просто меняет условие на противоположное - вместо того, чтобы обнаруживать те записи людей, которые являются предком целевого человека, он меняет проверку:

DECLARE @person hierarchyid

SELECT @person = Id
FROM dbo.HierachyTable
WHERE [Name] = 'Joe Blow';

SELECT
    Id, Id.ToString() AS [Path], 
    Id.GetLevel() AS [Level],
    Id.GetAncestor(1),
    Name
FROM 
    dbo.HierarchyTable
WHERE 
    @person.IsDescendantOf(Id) = 1

Это выберет все строки из вашей таблицы, где целевой человек вы Интересует потомок - любого уровня иерархии. Таким образом, будут найдены непосредственные и не непосредственные предки целевого человека вплоть до корня.

31
ответ дан 28 November 2019 в 07:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: