Die am häufigsten verwendete Ansatz würde
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
(angepasst von einem Simon Ince blog post)
Simon Ince auch einen rekursiven allgemeinen Tabellenausdruck (CTE) sein schlägt einen zweiten Ansatz, bei dem er den Zustand im Grunde nur umkehrt - anstatt diese Person Einträge des Erfassens, dass ein Vorfahre der Zielperson sind, er den Scheck dreht sich um:
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
Dadurch werden alle Zeilen aus einer Tabelle auswählen, wo die Zielperson, an der Sie interessiert sind, ein Nachkomme von - irgendeiner Ebene in der Hierarchie ist. So werden die direkten und nicht-unmittelbaren Vorfahren der Zielperson bis zur Wurzel gefunden.
Ist das nicht 'child.IsDescendantOf (Eltern)' die gleichen wie 'parent.IsAncestorOf (Kind)'? – Gabe