Родительское / дочернее иерархическое представление дерева - PullRequest
4 голосов
/ 21 февраля 2012

У меня родительская таблица выглядит такуровни и самостоятельное соединение, но все, что я могу найти в сети, это CTE-рекурсия

Я делал это раньше в Oracle, но не в MS SQL

Ответы [ 3 ]

10 голосов
/ 21 февраля 2012

Бит хакерский и может быть улучшен, но мы надеемся, что он показывает принцип ...

;with relation (childId, parentId, childName, [level], [orderSequence])  
as  
(  
select childId, parentId, childName, 0, cast(childId as varchar(20))  
from @parents  
where parentId is null  
union all  
select p.childId, p.parentId, r.[level]+1, cast(r.orderSequence + '_' + cast(p.childId as varchar) as varchar(20))  
from @parents p  
inner join relation r on p.parentId = r.childId  
)  

select right('----------', ([level]*3)) +childName  
from relation  
order by orderSequence

Если, однако, вы хотите избежать рекурсии, то альтернативным подходом является реализация таблицы дерева с соответствующей информацией о структуре дерева- см. http://www.sqlteam.com/article/more-trees-hierarchies-in-sql для прогулки по

3 голосов
/ 21 февраля 2012
declare @pc table(CHILD_ID int, PARENT_ID int, [NAME] varchar(80));
 
insert into @pc
select 1,NULL,'Bill' union all
select 2,1,'Jane' union all
select 3,1,'Steve' union all
select 4,2,'Ben' union all
select 5,3,'Andrew' union all
select 6,NULL,'Tom' union all
select 7,8,'Dick' union all
select 8,6,'Harry' union all
select 9,3,'Stu' union all
select 10,7,'Joe';
 
 
; with r as (
      select CHILD_ID, PARENT_ID, [NAME], depth=0, sort=cast(CHILD_ID as varchar(max))
      from @pc
      where PARENT_ID is null
      union all
      select pc.CHILD_ID, pc.PARENT_ID, pc.[NAME], depth=r.depth+1, sort=r.sort+cast(pc.CHILD_ID as varchar(30))
      from r
      inner join @pc pc on r.CHILD_ID=pc.PARENT_ID
      where r.depth<32767
)
select tree=replicate('-',r.depth*3)+r.[NAME]
from r
order by sort
option(maxrecursion 32767);

Это было непросто :).Я расширил пример для включения> 1 дерева.Результаты пока выглядят неплохо.

1 голос
/ 03 августа 2016
WITH DirectReports (ParentUniqId, UniqId, SortID)
AS
(
    SELECT e.ParentUniqId, e.UniqId, e.UniqId as SortID
    FROM Coding.Coding AS e
    WHERE isnull(ParentUniqId ,0)=0
    UNION ALL
    SELECT e.ParentUniqId, e.UniqId,, d.SortID * 100 + e.UniqId  as SortID
    FROM Coding.Coding AS e
    INNER JOIN DirectReports AS d
        ON e.ParentUniqId = d.UniqId

)
SELECT ParentUniqId, Perfix,SortID
FROM DirectReports order by rtrim(SortID) , uniqid
...