1

我正在使用 SQL Server 2008 HierarchyId 维护树结构。我的表结构是这样的:

CREATE TABLE [Employee](
[Id] [int] IDENTITY(1,1) NOT NULL,
[HId] [hierarchyid] NOT NULL,
[Lvl]  AS ([HId].[GetLevel]()) PERSISTED,
[Name] [varchar](200) NOT NULL)

所有叶子数据不在同一级别。我可以找出表的所有叶子记录。但我需要找出任何给定子树的叶子数据。换句话说,我需要“为不管理任何其他员工的任何给定经理找到所有下属”。

样本数据:

Id Path Lvl Name 
1 / 0 Emp1 
2 /1/ 1 Emp2 
3 /1/1/ 2 Emp3 
4 /1/1/1/ 3 Emp4 
5 /1/2/ 2 Emp5 
6 /1/2/1/ 3 Emp6 
7 /1/2/1/1/ 4 Emp7 
8 /1/2/1/2/ 4 Emp8 
9 /1/2/2/ 3 Emp9 
10 /1/2/2/1/ 4 Emp10 
11 /1/2/2/2/ 4 Emp11 
12 /1/2/2/3/ 4 Emp12 
13 /1/2/2/4/ 4 Emp13 
14 /1/2/2/5/ 4 Emp14 
25 /1/2/3/ 3 Emp15 
26 /1/2/3/1/ 4 Emp16 
27 /1/2/3/2/ 4 Emp17 
28 /1/2/4/ 3 Emp18 
29 /1/2/4/1/ 4 Emp19 
30 /1/2/4/2/ 4 Emp20 
15 /1/3/ 2 Emp21 
16 /1/3/1/ 3 Emp22 
18 /1/3/1/1/ 4 Emp23 
19 /1/3/1/2/ 4 Emp24 
17 /1/3/2/ 3 Emp25 
20 /1/3/2/1/ 4 Emp26 
21 /1/3/2/2/ 4 Emp27 
22 /1/3/2/3/ 4 Emp28 
23 /1/3/2/4/ 4 Emp29 
24 /1/3/2/5/ 4 Emp3 

请帮我找到这个。

4

1 回答 1

1

你想要这个IsDescendantOf功能。

例如:

declare @manager hierarchyid
select @Manager = HID from employee where --- criteria for given manager

Select *
from employee
where Hid.IsDescendantOf(@manager)=1

要找到那些不管理其他人的人,请添加

and Hid.GetDescendant(null,null) is null
于 2012-08-10T09:20:07.487 回答