我有下表:
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
有关如何在不添加其他列的情况下实现此目的的任何建议吗?
答案 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子句,您可以根据需要对输出进行排序
输出为