sql server 遞歸查詢的使用


一、業務情景:公司員工較多 ,上下級關系通過職位關聯,如果要找到某位領導的所有直接下屬 ,就需要找該職位的下一級職位,因為有些職位可能沒有員工,需一直找到有員工的職位為止。領導與下屬的職位關系屬於樹狀結構,采用遞歸的搜索方式,搜索停止的條件是查詢返回的是空結果集(沒有數據行返回)。屬於深度優先搜索算法。

二、表結構:

涉及到的表有 三個:

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  級是因為 該級有職位但是沒有員工。

記錄在此,方便以后查看。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM