0

假设一个组织指派员工对其他员工进行年度审查。每个 ReviewID(员工)都可以由多个员工 ID 进行审核。只有当特定的 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)

没有什么可查看的 EmployeeID (ReviewID=0) 应该是我的第一组列表 (3, 6, 7, 10)。现在可以开始审核的 EmployeedID 是 4,5(应该是我的第二组),因为他们需要审核 6、3 没有待处理的 ReviewID。这里不是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 级,因为所有必须审查的员工 1 都没有完成他们的审查,即,员工 1 应该来,因为员工 12 没有完成他的审查。一般来说,上面递归查询中的新数据子集应该过滤了 EmployeeID 1 和 2。解释起来有点棘手,但我希望我现在很清楚 :(

4

1 回答 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)
于 2013-08-29T21:23:11.667 回答