Учитывая таблицу с a hierarchyid
введите столбец, как Вы пишете запрос для возврата всех строк, которые являются предками определенного узла?
Существует IsDescendantOf()
функция, которая идеально подходит для получения детей, но нет никакого соответствия IsAncestorOf()
функционируйте для возврата предков (и отсутствие a GetAncestors()
функция походит на настоящий контроль.)
Наиболее часто используемый подход - это рекурсивное общее табличное выражение (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
Это выберет все строки из вашей таблицы, где целевой человек вы Интересует потомок - любого уровня иерархии. Таким образом, будут найдены непосредственные и не непосредственные предки целевого человека вплоть до корня.