Việc phổ biến nhất được sử dụng cách tiếp cận sẽ là một bảng thông thường Biểu hiện đệ quy (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
(chuyển thể từ một Simon Ince blog post)
Simon Ince cũng đề xuất một cách tiếp cận thứ hai nơi ông chỉ về cơ bản đảo ngược tình trạng này - thay vì phát hiện những mục người đó là tổ tiên của người mục tiêu, anh quay kiểm tra xung quanh:
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
này sẽ chọn tất cả các hàng từ bảng của bạn, nơi mà người mà bạn quan tâm đến là một hậu duệ của - bất kỳ cấp độ nào trong hệ thống phân cấp. Vì vậy, điều này sẽ tìm thấy tổ tiên ngay lập tức và không ngay lập tức của mục tiêu tất cả các con đường lên đến gốc.
Nguồn
2010-06-25 17:00:07
Không phải là 'child.IsDescendantOf (mẹ) 'giống như' parent.IsAncestorOf (con) '? – Gabe