[英]SQL Server hierarchical query
我在 SQL 服务器数据库中有一个这样的用户设置表
UserID ReportsToUserID
1 NULL
2 NULL
3 1
4 2
5 2
6 3
7 5
...
SQL 中有没有办法让我可以让报告链上的所有员工。 例如,当我提供 1 时,我期望得到employeesID 3,6
当我提供 2 时,我期待4,5,7
我不知道go下的最大链数
这是一个递归 CTE,您可以使用NULL
为整个层次结构或使用特定的UserID
设置@Top
Declare @YourTable Table ([UserID] int,[ReportsToUserID] int)
Insert Into @YourTable Values
(1,NULL)
,(2,NULL)
,(3,1)
,(4,2)
,(5,2)
,(6,3)
,(7,5)
Declare @Top int = null --<< Sets top of Hier Try 1 or 2
;with cteP as (
Select UserID
,ReportsToUserID
,HierID = convert(hierarchyid,concat('/',UserID,'/'))
From @YourTable
Where IsNull(@Top,-1) = case when @Top is null then isnull(ReportsToUserID ,-1) else UserID end
Union All
Select UserID = r.UserID
,ReportsToUserID = r.ReportsToUserID
,HierID = convert(hierarchyid,concat(p.HierID.ToString(),r.UserID,'/'))
From @YourTable r
Join cteP p on r.ReportsToUserID = p.UserID)
Select R1 = Row_Number() over (Order By HierID)
,R2 = (Select count(*) From cteP where HierID.ToString() like A.HierID.ToString()+'%')
,Lvl = HierID.GetLevel()
,UserID
,ReportsToUserID
,HierID_String = HierID.ToString()
From cteP A
Order By A.HierID
退货
现在如果 @Top 设置为 1
笔记:
R1, R1,Lvl and HierID_String
是完全可选的和示范性的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.