Sql server 如何在SQL server中查找分层顺序

Sql server 如何在SQL server中查找分层顺序,sql-server,loops,Sql Server,Loops,假设一个组织指派员工对其他员工进行年度审查。每个被审核人(员工)都可以由多个EmployeeID进行审核。只有当某个特定的reviewID完成了所有的reviewID或没有待定的reviewID时,员工才能开始/进行复审。 示例数据代码: CREATE TABLE FindOrder ( EmployeeID int ,ReviewID int ) insert findorder values (1,3), (1,10), (1,12)

假设一个组织指派员工对其他员工进行年度审查。每个被审核人(员工)都可以由多个EmployeeID进行审核。只有当某个特定的reviewID完成了所有的reviewID或没有待定的reviewID时,员工才能开始/进行复审。 示例数据代码:

    CREATE TABLE FindOrder
    (
    EmployeeID int
    ,ReviewID int
    )
     insert findorder
    values (1,3), (1,10), (1,12), (2,3), (2,5), (2,7), (3,0), (4,6), (5, 3), (6,0),      (7,0), (10,0), (12,5)
我的第一组列表(3、6、7、10)应该是没有任何可查看内容(ReviewID=0)的EmployeeID。现在可以开始审核的员工ID是4,5(应该是我的第二套),因为他们需要审核6,3个没有待定审核的员工。这里没有员工ID 1或2,因为1已经审核了12名未完成所有审核的员工。等等。。。 如果我还不清楚,请告诉我。 我想找到订单级别,级别0是(6,10,7,3),级别1是(5,4),级别2是(2,12),级别3是(1)

我尝试了这个cte来寻找订单:

;WITH CTE AS
(
SELECT EmployeeID, ReviewID, 0 AS [Level] FROM FindOrder WHERE NETOUT = '0'
UNION  ALL
SELECT NN.EmployeeID, NN.ReviewID, [Level]+1  FROM FindOrder nn
JOIN CTE ON NN.ReviewID=CTE.EmployeeID
)
SELECT *  FROM CTE
但我在一级和三级都有员工ID 1。员工ID 1不应进入第1级,因为所有ppl员工1必须审核的内容均未完成审核,即员工1应进入第12级,因为员工12未完成审核。 一般来说,上面递归查询中的新数据子集应该已经过滤了EmployeeID 1和2。
解释起来有点棘手,但我希望我现在清楚了:(

看起来你的级别实际上应该是给定员工所需的最长审查路径。例如,员工一号有以下路径

1->3
1->10
1->12->5->3
这名员工的级别是最长的路径,如果我理解你的问题,那就是你唯一关心的问题。试试这个

;WITH CTE AS
(
SELECT EmployeeID, ReviewID, 0 AS [Level] FROM FindOrder WHERE ReviewId = '0'
UNION  ALL
SELECT NN.EmployeeID, NN.ReviewID, [Level]+1  FROM FindOrder nn
JOIN CTE ON NN.ReviewID=CTE.EmployeeID
)
SELECT EmployeeId, MAX(Level) AS Level FROM CTE 
GROUP BY EmployeeID
ORDER BY MAX(Level)