2013-08-29 25 views
0

假定組織分配員工爲其他員工進行年度審閱。每個ReviewID(誰是員工)都可以通過多個員工ID進行審覈。只有特定評論ID完成了所有評論ID或沒有待審覈ID時,員工纔可以開始/完成評論。 示例數據代碼:如何在SQL服務器中查找Hierarachical訂單

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) 

EmployeeIDs什麼都沒有審查(ReviewID = 0)應該是我的第一組清單(3,6,7,10)的。現在可以開始審覈的僱主ID是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 1級和3級僱員1不應該在1的水平來作爲所有員工的脂肪酶1有權審查沒有完成他們的評論,即僱員1應該來,因爲僱員12沒有完成他的評論。 一般來說,在上述遞歸查詢數據的新子集應該過濾僱員1和2 有點棘手解釋,但我希望我清楚現在:(

回答

0

它看起來像你的水平實際上應的最長路徑需要給定僱員的評論。例如,員工一個具有以下路徑...

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) 
+0

謝謝,這適用於我的場景 – user2730375

+0

很高興聽到它,請記住接受答案 – dazedandconfused