我遇到了一个问题,试图递归地遍历层次结构,以查找组织结构中所有后代节点的顶级节点,该组织结构可能有多个顶级节点。我试图使用SQL Server 2012 CTE来做到这一点,但它不会递归到达每个分支的顶级节点。我已经尝试写下我的查询,如其他与此相关的帖子所示,但仍然没有骰子。 (至少我认为我是。)我希望有人能告诉我我在这里做错了什么?这个职位最密切涉及到我想要做的,我已经试过了公认的答案,但我仍然只是没有“得到它”:Finding a Top Level Parent in SQLSQL Server 2012 CTE找到根级别或顶级父级的分层数据
如上图所示,我有OrgGroups
引用直接父组,除非它是顶级,然后它是NULL。例如,(4)财务(顶级) - >(5)人力资源 - >(11)福利
我想创建一个数据库视图,列出每个组合的连同其TOP-MOST祖先的ID。 (不是他们的直接父母)
因此,例如,DB视图将具有(11)BenefitsOrgGroup的记录以及它的(4)Finance的最顶级parentgroupId的对应列值。
;WITH OrgStructureIndex AS
(
SELECT O.OrgGroupId, O.Name, O.OrgStructureId, O.ParentGroupId, 1 AS Lvl
FROM OrgGroups O
UNION ALL
SELECT OG.OrgGroupId, OG.Name, OG.OrgStructureId, OG.ParentGroupId, Lvl+1 AS Lvl
FROM OrgGroups OG INNER JOIN OrgStructureIndex OI
ON OI.OrgGroupId = OG.ParentGroupId
)
SELECT * FROM OrgStructureIndex
这会导致福利组织具有(5)HR的最高ParentGroupId。期望的结果将是(4)财务。它也会导致重复记录。
为了摆脱重复的,至少,我已经改变了我的SQL:
;WITH OrgStructureIndex AS
(
SELECT O.OrgGroupId, O.Name, O.OrgStructureId, O.ParentGroupId, 1 AS Lvl
FROM OrgGroups O
UNION ALL
SELECT OG.OrgGroupId, OG.Name, OG.OrgStructureId, OG.ParentGroupId, Lvl+1 AS Lvl
FROM OrgGroups OG INNER JOIN OrgStructureIndex OI
ON OI.OrgGroupId = OG.ParentGroupId
)
,CTE_RN AS
(
SELECT *, ROW_NUMBER() OVER (PARTITION BY oi.OrgGroupId ORDER BY oi.Lvl DESC) RN
FROM OrgStructureIndex oi
)
SELECT * FROM CTE_RN
WHERE RN = 1
我在哪里落下短这里? TIA
啊!是的,我确实有ParentGroupId在那里是空的,并且一直在搞这样的事情,我忘了把它放回去。我会尝试你的建议! – razaross444 2014-11-20 22:28:49
真棒!精美的作品罗杰。非常感谢! – razaross444 2014-11-20 22:35:03