SQL组2行基于列值

时间:2017-11-08 06:58:04

标签: sql sql-server

我有下表:

Row ID Name Parent
1   c1 John p1 
2   c2 Dave p2
3   p1 Lex  p3

我想将具有由ID和父列指示的子和父关系的行分组,例如

查询应该返回

Row ID Name Parent
1   c1 John p1
3   p1 Lex  p3
2   c2 Dave p2

有关如何在不添加其他列的情况下实现此目的的任何建议吗?

1 个答案:

答案 0 :(得分:3)

由于您正在使用SQL Server,因此我可以选择使用recursive CTE SQL query,因为我分享了以下代码

/*
create table hierarchy_data
(
Row int,
ID varchar(2),
Name varchar(20),
Parent varchar(2)
)
insert into hierarchy_data select 1   ,'c1', 'John', 'p1' 
insert into hierarchy_data select 2   ,'c2' ,'Dave' ,'p2'
insert into hierarchy_data select 3   ,'p1' ,'Lex'  ,'p3'
*/
;with cte as (
    select 
        row, 
        id, 
        name, 
        parent,
        row_number() over (order by id) as groupno,
        1 as level
    from hierarchy_data
    where parent not in (
        select id from hierarchy_data
    )

    union all

    select
        h.row,
        h.id,
        h.name,
        h.parent,
        cte.groupno,
        cte.level + 1
    from cte
    inner join hierarchy_data h
        on cte.id = h.parent

)
select *
from cte
order by groupno, level

在CTE表达式中构建层次结构或父子关系。 通过使用ORDER BY子句,您可以根据需要对输出进行排序

输出为

enter image description here