2

寻找 SQL Server CTE 示例以创建层次结构,以便我可以输出所有系列,例如展平每个层次结构。例如,在家庭树中,如果根从父级开始,我需要每个家庭成员的层次结构列表以及成员详细信息 + 父级的行详细信息,例如

  child1 row
  child1 +Parent row
  child1 + Grand parent Row

  child2 Row
  child2 + parent row
  child2 + grand parent's row

 and so on
     CREATE TABLE Family(id int NULL,
Name varchar(20) null,  Parent_id int NULL, level int NULL  ) 


INSERT INTO Family VALUES
    (1, 'Grand Parent',NULL,    1),         
    (2, 'Parent'    ,   1,      2),
    (3, 'Child1'    ,   2,      3),
    (4, 'Child2'    ,   2,      3)     

    select * from Family;

id  Name          Parent_id   level
 1  Grand Parent  NULL         1
 2  Parent        1            2
 3  Child1        2            3
 4  Child2        2            3

这就是我目前能做的。父行的详细信息在第 5 列和第 6 列中。

with cte as
(
    select ID,Parent_id,level,Name,id as  parent_id,level, 'a' as type
        from family 
        --where ID=3
    union all
    select  f.ID,f.Parent_id,f.level,f.Name,c.id as parent_id,c.level, 'r' as type
    from family f
    inner join cte c
    on f.parent_id=c.id
)
select * from cte order by id

结果应该是这样。(注意第 5 栏和第 6 栏)

Child_ID  Parent_id   Child_level   Name    parent_id   level   
1          NULL        1          Grand Parent    1           1  
2          1           2          Parent          2           2  
2          1           2          Parent          1           1  
3          2           3          Child1          1           1  
3          2           3          Child1          2           2  
3          2           3          Child1          3           3   
4          2           3          Child2          4           3  
4          2           3          Child2          2           2   
4          2           3          Child2          1           1   

提前致谢。

4

1 回答 1

10
with cte as (
    select ID, Name, level, Parent_id
    from family

    union all

    select cte.ID, cte.Name, cte.level, family.Parent_id
    from cte
    inner join family on cte.Parent_id = family.ID
)
select cte.ID as Child_ID, f2.Parent_ID, cte.level as Child_level, cte.Name, isnull(cte.Parent_id, cte.ID) as parent_ID, isnull(f.level, cte.level) as level
from cte
left outer join family f on cte.Parent_id = f.ID
inner join family f2 on cte.id = f2.ID
order by 1, 5
于 2013-02-24T18:54:53.280 回答