• 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  级是因为 该级有职位但是没有员工。

    记录在此,方便以后查看。

  • 相关阅读:
    BZOJ1001 BJOI2006 狼抓兔子
    NOI2015 程序自动分析
    高斯消元法
    [POJ] 3666 Making the Grade
    [CODEVS] 2185 最长公共上升子序列
    [模板] LIS
    [CF] 219D Choosing Capital for Treeland
    [POJ] 2823 Sliding Window
    [BZOJ] 1072 [SCOI2007]排列perm
    [POJ] 1094 Sorting It All Out
  • 原文地址:https://www.cnblogs.com/qingcaodi/p/13050270.html
Copyright © 2020-2023  润新知