在CTE中找到多个顶级父母

时间:2015-05-07 17:38:28

标签: sql sql-server

我正在编写一个非常标准的CTE来递归查找树并找到顶级父级。如果OrganizationID_Parent为空,则确定顶级父级。我传递了一个managerID,我想知道他们管理的组织中最顶级的组织。

这是我的CTE

;WITH OrgCTE AS
(
    SELECT o.OrganizationID_Parent , o.OrganizationID, 1 AS Lvl FROM Organization o
    WHERE OrganizationID IN (SELECT OrganizationID FROM OrganizationManager WHERE AdjusterID_Mgr = @ManagerID)

    UNION ALL

    SELECT o.OrganizationID_Parent, cte.OrganizationID, Lvl + 1 AS Lvl 
    FROM dbo.Organization o
    INNER JOIN OrgCTE cte ON o.OrganizationID = cte.OrganizationID_Parent

)

SELECT * FROM OrgCTE

我遇到的问题是我的结果很奇怪。树是这样的:

OrganizationID_Parent    OrganizationID
         NULL                  1
         NULL                  2
          2                   137
         137                  140

我的子选择返回1和140,整个查询返回父项不匹配和不正确的数据。我需要查询返回1和2,因为他们是最高父母。

以下是我得到的结果:

OrganizationID_Parent    OrganizationID
         NULL                  1
         137                  140
          2                   140
         NULL                 140

以下是我想要的结果:

OrganizationID_Parent    OrganizationID
         NULL                  1
         137                  140
          2                   137
         NULL                  2

1 个答案:

答案 0 :(得分:1)

只是一个小小的更新。在CTE的递归部分中,您选择初始OrganizationID而不是父行的值。

;WITH OrgCTE AS
(
    SELECT o.OrganizationID_Parent , o.OrganizationID, 1 AS Lvl FROM Organization o
    WHERE OrganizationID IN (SELECT OrganizationID FROM OrganizationManager WHERE AdjusterID_Mgr = @ManagerID)

    UNION ALL

    SELECT o.OrganizationID_Parent, /*changes here o instead of cte */o.OrganizationID, Lvl + 1 AS Lvl 
    FROM dbo.Organization o
    INNER JOIN OrgCTE cte ON o.OrganizationID = cte.OrganizationID_Parent

)

SELECT * FROM OrgCTE