如何在SQL Server中查找分层次序

时间:2013-08-29 18:33:29

标签: sql-server loops

假设一个组织指派员工对其他员工进行年度审核。每个ReviewID(谁是员工)都可以通过多个employeeID进行审核。仅当特定审核ID完成了所有审核ID或没有待审核ID时,员工才能开始/执行审核。 示例数据代码:

    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)

无需审核的EmployeeID(ReviewID = 0)应该是我的第一组列表(3,6,7,10)。现在可以开始审核的EmployeedID是4,5(应该是我的第二套),因为他们需要审核6,3个没有待审核的ID。这里不是employeeIDs 1或2,因为1有reviewID 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

但我在1级和3级获得Employeeid 1. EmployeeID 1不应该进入1级,因为所有ppl员工1必须审核没有完成他们的评论,即员工1应该来,因为员工12没有完成他的评论。 通常,上面的递归查询中的新数据子集应该已经过滤了EmployeeID 1和2。 解释起来有点棘手,但我希望我现在很清楚:(

1 个答案:

答案 0 :(得分:1)

看起来您的级别实际上应该是给定员工所需的最长审核路径。例如,员工1具有以下路径......

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)