Дерево PATH рекурсивная проблема в SQL, я думаю это рекурсивное - PullRequest
0 голосов
/ 23 апреля 2020

Эта таблица имеет два столбца DepartmentId и Parent_DepartmentId. Мне нужно создать столбец PATH без использования команд DDL. Я знаю, что это рекурсия, но я не понимаю, рекурсия. Каков ответ на это? Спасибо

Ответы [ 2 ]

0 голосов
/ 23 апреля 2020

Другой вариант - использовать hierachyid тип данных

Пример

Declare @YourTable Table ([DepartmentId] int,[Parent_DepartmentId] int)  
Insert Into @YourTable Values 
 (0,-1)
,(1,0)
,(2,1)
,(3,1)
,(4,0)
,(5,2)
,(6,5)
,(7,1)


;with cteP as (
      Select DepartmentId
            ,Parent_DepartmentId 
            ,HierID = convert(hierarchyid,concat('/',DepartmentId,'/'))
      From   @YourTable 
      Where  Parent_DepartmentId =-1
      Union  All
      Select DepartmentId  = r.DepartmentId
            ,Parent_DepartmentId  = r.Parent_DepartmentId 
            ,HierID = convert(hierarchyid,concat(p.HierID.ToString(),r.DepartmentId,'/'))
      From   @YourTable r
      Join   cteP p on r.Parent_DepartmentId  = p.DepartmentId)
Select Lvl   = HierID.GetLevel()
      ,DepartmentId
      ,Parent_DepartmentId
      ,Path = HierID.ToString()
 From cteP A
 Order By A.HierID

Возвращает

enter image description here

0 голосов
/ 23 апреля 2020

Обычно вы можете использовать рекурсивный запрос для этого. Предполагая, что parent_department_id из -1 обозначает root дерева:

with cte as (
    select department_id, parent_department_id, cast(department_id as varchar(max)) path
    from mytable
    where parent_department_id = -1
    union all
    select 
        t.department_id,
        t.parent_department_id,
        path + '.' + cast(t.department_id as varchar(max))
    from mytable t
    inner join cte c on c.department_id = t.parent_department_id
)
select * from cte

Демонстрация на DB Fiddle :

department_id | parent_department_id | path     
------------: | -------------------: | :--------
            0 |                   -1 | 0        
            1 |                    0 | 0.1      
            2 |                    1 | 0.1.2    
            3 |                    1 | 0.1.3    
            4 |                    0 | 0.4      
            5 |                    2 | 0.1.2.5  
            6 |                    5 | 0.1.2.5.6
            7 |                    1 | 0.1.7    
...