Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 具有非数值层次数据的递归CTE_Sql Server 2005_Tsql_Recursion_Common Table Expression - Fatal编程技术网

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:查看我的编辑。我们得出了几乎相同的结论;