具有非数字层次结构数据的递归CTE

时间:2011-05-11 17:34:21

标签: sql-server-2005 tsql recursion common-table-expression

我有一张(简化的)表格:

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

如果出现以下情况,组织是其他组织的子女:

  1. 孩子的长度比父母
  2. 大1
  3. 父级的Hierarchy代码与子代码的第一个LEN(Parent.Hierarchy)完全匹配
  4. 所以在我的表中:

    1. Org2和Org3是Org1的孩子
    2. Org4是Org3的孩子,是Org1的孙子
    3. 我的问题是如何编写递归层次结构来查找特定组织的所有后代?我读过的所有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很新,谢谢你的帮助!

1 个答案:

答案 0 :(得分: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