2011-05-11 32 views
1

我有一个(简化)表:递归CTE与非数字分层数据

OrgName | Hierarchy 
---------|------------ 
Org1  | A 
Org2  | AA 
Org3  | AB 
Org4  | ABA 

组织是另一个组织的一个孩子,如果:

  1. 孩子的长度比大于1父
  2. 母公司的层次码完全匹配孩子的代码的第一个LEN(Parent.Hierarchy)

所以在我的表:

  1. ORG2和Org3是孩子ORG1
  2. 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

编辑:

这应该这样做。我忽略了你开始与递归级别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 
+0

这仅返回“锚”行,我觉得你的东西上,虽然 – SupremeDud 2011-05-11 17:46:26

+0

我要去接受这个因为它使我的答案: INNER JOIN Org_cte ON子(o.hierarchy,1,org_cte.recursionLevel)= org_cte.hlevel 和len(o.hierarchy)= LEN(org_cte.HLevel)+ 1 我也必须从0 – SupremeDud 2011-05-11 17:56:29

+0

@SupremeDud更改锚的RecursionLevel为1:请参阅我的编辑。我们想出了几乎相同的东西;) – 2011-05-11 17:57:26