2017-05-30 170 views
0

比方说,我们已经有了这个表:如何递归选择父元素下的所有子元素?

WORKER 
NAME  ID ManagerID 
------------------------ 
John  1  3 
Sally 2  3 
Paul  3  4 
Jane  4  5 
Jennifer 5  8 

因此,约翰和萨莉对保罗的工作,和保罗的作品简。

对于SQL查询,我想给它喂食简的ID(4),并使其返回回她的所有下属:

John  1  3 
Sally 2  3 
Paul  3  4 

我还需要为此查询递归去深达是需要。例如,也许约翰有人为他工作,所以他们也会被包含在结果中。


您将如何构建此查询?

回答

1
Declare @YourTable Table ([NAME] varchar(50),[ID] varchar(50),[ManagerID] varchar(50)) 
Insert Into @YourTable Values 
('John',1,3) 
,('Sally',2,3) 
,('Paul',3,4) 
,('Jane',4,5) 
,('Jennifer',5,8) 
,('Boss',8,null) 


Declare @Top int   = 4  --<< NULL for Full Hier 
Declare @Nest varchar(25) = '|-----' --<< Optional: Added for readability 

;with cteP as (
     Select Seq = cast(10000+Row_Number() over (Order by Name) as varchar(500)) 
      ,ID 
      ,ManagerId 
      ,Lvl=1 
      ,Name 
     From @YourTable 
     Where IsNull(@Top,-1) = case when @Top is null then isnull(ManagerId ,-1) else ID end 
     Union All 
     Select Seq = cast(concat(p.Seq,'.',10000+Row_Number() over (Order by r.Name)) as varchar(500)) 
      ,r.ID 
      ,r.ManagerId 
      ,p.Lvl+1 
      ,r.Name 
     From @YourTable r 
     Join cteP p on r.ManagerId = p.ID) 
Select A.ID 
     ,A.ManagerId 
     ,A.Lvl 
     ,Name = Replicate(@Nest,A.Lvl-1) + A.Name 
From cteP A 
Order By Seq 

返回

ID ManagerId Lvl Name 
4 5   1 Jane 
3 4   2 |-----Paul 
1 3   3 |-----|-----John 
2 3   3 |-----|-----Sally 
1

您可以使用简单的递归CTE这个如下:

;With cte as (
    Select * from YourWorker where ManagerId = 4 

    union all 

    select y.WorkerName, y.Id, y.ManagerId from YourWorker y inner join cte c 
    on y.ManagerId = c.Id 
) 
select * from cte 

输出如下:

+------------+----+-----------+ 
| WorkerName | Id | ManagerId | 
+------------+----+-----------+ 
| Paul  | 3 |   4 | 
| John  | 1 |   3 | 
| Sally  | 2 |   3 | 
+------------+----+-----------+ 
相关问题