递归 CTE 在 SQL 服务器中查找层次结构中的第一个管理器

Recursive CTE finding the first manager in hierarchy in SQL Server

我有一个用户table

并且我想通过他们的工作位置层次结构为每个用户找到他们的第一位经理。

我设法写了这个脚本,但我似乎无法让它正常工作。我需要用户 1003 必须具有 1001 managerId。现在它显示 1002。

select 1001 as userid, 'L1' as locationCode, NULL as parentLocationCode, 1 as isManager into #Users union all
select 1002 as userid, 'L2' as locationCode, 'L1' as parentPad, 0 as isManager union all
select 1003 as userid, 'L3' as locationCode, 'L2' as parentPad, 0 as isManager 

;WITH cte_org AS (
    SELECT       
        d.userid 
        ,d.locationCode
        ,d.parentLocationCode
        ,d.isManager
        ,null as managerId
    FROM       
        #Users as d
    WHERE d.parentLocationCode is NULL
    UNION ALL
    SELECT 
        d.userid 
        ,d.locationCode
        ,d.parentLocationCode
        ,d.isManager
        ,o.userid as managerId
    FROM 
        #Users as d
        inner JOIN cte_org o on d.parentLocationCode=o.locationCode
)
SELECT *
FROM cte_org
OPTION (MAXRECURSION 32767);

您只需使用 managerId 设置 managerId,然后将 managerId 复制到链接记录

select 1001 as userid, 'L1' as locationCode, NULL as parentLocationCode, 1 as isManager into #Users union all
select 1002 as userid, 'L2' as locationCode, 'L1' as parentPad, 0 as isManager union all
select 1003 as userid, 'L3' as locationCode, 'L2' as parentPad, 0 as isManager 
;

WITH
cte_org AS (
    SELECT       
        d.userid 
        ,d.locationCode
        ,d.parentLocationCode
        ,d.isManager
        ,d.userid as managerId
    FROM       
        #Users as d
    WHERE d.parentLocationCode is NULL
    UNION ALL
    SELECT 
        d.userid 
        ,d.locationCode
        ,d.parentLocationCode
        ,d.isManager
        ,o.managerId as managerId
    FROM 
        #Users as d
        inner JOIN cte_org o on d.parentLocationCode=o.locationCode
)
SELECT *
FROM cte_org
OPTION (MAXRECURSION 32767);

userid  locationCode    parentLocationCode  isManager   managerId
1001    L1                                  1           1001
1002    L2              L1                  0           1001
1003    L3              L2                  0           1001