Given a table with a hierarchyid type column, how do you write a query to return all rows that are ancestors of a specific node?
There is an IsDescendantOf() function, which is perfect for getting the children, but there’s no corresponding IsAncestorOf() function to return ancestors (and the absence of a GetAncestors() function seems like quite an oversight.)
The most commonly used approach would be a recursive Common Table Expression (CTE)
(adapted from a Simon Ince blog post)
Simon Ince also proposes a second approach where he just basically reverses the condition – instead of detecting those person entries that are an ancestor of the target person, he turns the check around:
This will select all the rows from your table, where the target person you’re interested in is a descendant of – any level down the hierarchy. So this will find that target person’s immediate and non-immediate ancestors all the way up to the root.