假设一个组织指派员工对其他员工进行年度审查。每个 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。解释起来有点棘手,但我希望我现在很清楚 :(