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