tsql中的树结构-如何通过分支中的特殊class获取数据

Tree structure in tsql - How get data by the special class in branches

我有这样的结构(例如):

ID    ClassId   Name         Parent
--------------------------------------
1      12      Boss       
2      13      Manager1         1
3      13      Manager2         1
4      13      Manager3         1
5      14      SubManager1      3
6      15      UnderSubManager1 5
7      16      Worker1          2
8      16      Worker2          6
9      14      SubManager2      4
10     16      Worker3          9

然后,我们有这个:

Boss->Manager1->Worker1
Boss->Manager2->SubManager1->UnderSubManager1->Worker2
Boss->Manager3->SubManager2->Worker3

我需要查询,结果是这样的:

Boss->Manager1->worker1
Boss->Manager2->worker2
Boss->Manager3->worker3

我尝试这样做 CTE 使用 ClassId 但结果很差:(

假设您要显示 2 个最高级别(Boss 和 ManagerX),然后是最低级别 (WorkerX) -

create table #tmp (ID int, ClassID int, Name varchar(32), Parent int)
go

insert into #tmp (ID, ClassID, Name, Parent)
values
(1, 12, 'Boss', null)
, (2, 13, 'Manager1', 1)
, (3, 13, 'Manager2', 1)
, (4, 13, 'Manager3', 1)
, (5, 14, 'SubManager1', 2)
, (6, 15, 'UnderSubManager1', 5)
, (7, 16, 'Worker1', 2)
, (8, 16, 'Worker2', 6)
, (9, 14, 'SubManager2', 4)
, (10, 16, 'Worker3', 9)
go

with cte as (
    select t.ID, t.ClassID, t.Name, t.Parent
    , Path = cast(case when t.ClassID in (12, 13) then t.Name else '' end as varchar(max))
    , NestLevel = 0
    , IsWorker = case t.ClassID when 16 then 1 else 0 end
    from #tmp t
    where t.Parent is null

    union all

    select t.ID, t.ClassID, t.Name, t.Parent
    , Path = cte.Path + cast(case when t.ClassID in (12, 13, 16) then '->' + t.Name else '' end as varchar(max))
    , NestLevel = cte.NestLevel + 1
    , IsWorker = case t.ClassID when 16 then 1 else 0 end
    from #tmp t
    inner join cte on t.Parent = cte.ID

)
select cte.Path
from cte
where cte.IsWorker = 1
order by cte.Path



drop table #tmp
go

结果:

Boss->Manager1->Worker1
Boss->Manager1->Worker2
Boss->Manager3->Worker3