我正在编写一个非常标准的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
答案 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