Рекурсивный CTE с нечисловыми данными иерархии - PullRequest
1 голос
/ 11 мая 2011

У меня есть (упрощенная) таблица:

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, спасибо за помощь!

1 Ответ

0 голосов
/ 11 мая 2011

Редактировать:

Это должно сделать это.Я упустил из виду, что вы начинаете с уровня рекурсии 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
...