【问题标题】:Recursive CTE with non-numeric hierarchy data具有非数字层次结构数据的递归 CTE
【发布时间】:2011-05-11 17:34:20
【问题描述】:

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

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 的新手,感谢您的帮助!

【问题讨论】:

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


    【解决方案1】:

    编辑:

    应该这样做。我忽略了您从递归级别 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
    

    【讨论】:

    • 这只会返回“锚”行,但我认为您有所收获
    • 我会接受这个,因为它引导我找到答案:INNER JOIN Org_cte ON substring(o.hierarchy, 1, org_cte.recursionLevel) = org_cte.hlevel AND LEN(o.hierarchy) = LEN(org_cte.HLevel) + 1 我还必须将锚的 RecursionLevel 从 0 更改为 1
    • @SupremeDud:查看我的编辑。我们想出了几乎相同的东西;)
    猜你喜欢
    • 2013-11-07
    • 1970-01-01
    • 2023-03-24
    • 2019-07-02
    • 2016-04-15
    • 1970-01-01
    • 1970-01-01
    • 2013-11-22
    • 2017-02-04
    相关资源
    最近更新 更多