一、業務情景:公司員工較多 ,上下級關系通過職位關聯,如果要找到某位領導的所有直接下屬 ,就需要找該職位的下一級職位,因為有些職位可能沒有員工,需一直找到有員工的職位為止。領導與下屬的職位關系屬於樹狀結構,采用遞歸的搜索方式,搜索停止的條件是查詢返回的是空結果集(沒有數據行返回)。屬於深度優先搜索算法。
二、表結構:
涉及到的表有 三個:
1.員工職位表 :ORG_Position_Employee(列:PositionID(職位ID),Code (員工工號))
2.職位關系表 :Jobs_Info(列:jobs_id(職位ID),H_positions(上級職位ID),Jobs_Name(職位名稱))
3.員工表:VW_EmpJobsInfo_All(此處暫時使用視圖 ,關鍵列:PositionID(職位ID),h_positions(上級職位ID),PositionName(職位名稱),code(員工工號))
三、遞歸循環語句
1 declare @JobNo nvarchar(50) 2 3 set @JobNo='2259';----注意 with 前必須有分號 4 ---遞歸算法求出子節點所有下屬員工,不包括已有其他上屬的員工,即只找到直接下屬即可 5 WITH cte 6 AS 7 ( 8 SELECT jobs_id ,h_positions,0 AS level FROM Jobs_Info WHERE h_positions in 9 ( select PositionID from ORG_Position_Employee where code=@JobNo ) 10 UNION ALL 11 SELECT g.jobs_id,g.h_positions ,level+1 FROM Jobs_Info g inner JOIN cte 12 ON g.h_positions=cte.jobs_id 13 where 14 g.h_positions not in ( SELECT PositionID FROM VW_EmpJobsInfo_all )--不包括已有其他上屬的員工 15 --VW_EmpJobsInfo_all 是在職員工信息表,如果該職位員工有 h_positions 則該員工是領導 16 ) 17 SELECT code,PositionName,PositionID,a.H_positions,b.level FROM 18 VW_EmpJobsInfo_all a, 19 cte b 20 where a.PositionID=b.jobs_id 22 order by level
上下級職位是通過h_positions 列進行關聯的,查詢結果如下:

從level 列可以看出查詢深度是4級。
此處‘軟件開發經理’ 及’ 系統維護經理’是領導,是有下屬員工的,如果上述sql 去掉 where g.h_positions not in ( SELECT PositionID FROM VW_EmpJobsInfo_all ) 的查詢條件,那么查詢的結果是

此種情況查詢深度達到7級,而之所以沒有顯示出 1、2、5、6 級是因為 該級有職位但是沒有員工。
記錄在此,方便以后查看。
