Sql server 2005 具有非数值层次数据的递归CTE
我有一个简化的表格:Sql server 2005 具有非数值层次数据的递归CTE,sql-server-2005,tsql,recursion,common-table-expression,Sql Server 2005,Tsql,Recursion,Common Table Expression,我有一个简化的表格: OrgName | Hierarchy ---------|------------ Org1 | A Org2 | AA Org3 | AB Org4 | ABA 一个组织是另一个组织的子组织,如果: 子对象的长度比父对象的长度大1 父级的层次结构代码与子级代码的第一个LENParent.Hierarchy完全匹配 因此,在我的表格中: Org2和Org3是Org1的子级 Org4是Org3的孩子,也是Org1的孙子 我的问题是如何编
OrgName | Hierarchy
---------|------------
Org1 | A
Org2 | AA
Org3 | AB
Org4 | ABA
一个组织是另一个组织的子组织,如果:
子对象的长度比父对象的长度大1
父级的层次结构代码与子级代码的第一个LENParent.Hierarchy完全匹配
因此,在我的表格中:
Org2和Org3是Org1的子级
Org4是Org3的孩子,也是Org1的孙子
我的问题是如何编写递归层次结构来查找特定组织的所有后代?我读过的所有CTE示例都有连接的数字条件,比如Employee.ManagerID=CTE.EmpID。以下是我目前掌握的情况:
DELCARE @search VARCHARE = 'A'
WITH Org_cte (OrgName, HLevel, RecursionLevel)
AS
(SELECT o.OrgName, o.Hierarchy, 0 as RecursionLevel
FROM OrgTable o
WHERE o.Hierarchy = @search
UNION ALL
SELECT o.OrgName, o.Hierarchy, RecursionLevel + 1
FROM OrgTable o
INNER JOIN Org_cte
ON ???)
SELECT OrgName, HLevel, Recursion FROM Org_cte
我是CTE的新手,谢谢你的帮助 编辑:
这应该可以做到。我忽略了从递归级别0开始,需要排除相同级别:
WITH org_cte (OrgName, HLevel, RecursionLevel)
AS
(
SELECT o.OrgName, o.Hierarchy, 1 as RecursionLevel
FROM OrgTable o
WHERE o.Hierarchy = 'A'
UNION ALL
SELECT o.OrgName, o.Hierarchy, RecursionLevel + 1
FROM OrgTable o
JOIN Org_cte
ON substring(o.hierarchy, 1, org_cte.recursionLevel) = org_cte.hlevel
AND o.hierarchy <> org_cte.hlevel
)
SELECT OrgName, HLevel, RecursionLevel
FROM Org_cte
这只返回“anchor”行,我想你找到了一些东西,我会接受它,因为它会引导我找到答案:substringo.hierarchy上的内部连接组织,1,org_cte.recursionLevel=org_cte.hlevel和LENo.hierarchy=LENorg_cte.hlevel+1我还必须将锚的recursionLevel从0@SupremeDud:查看我的编辑。我们得出了几乎相同的结论;