问题描述
|
我需要从单个表中返回树状结果。目前,im正在使用connect by并开始使用,以确保返回所有正确的结果。
select id,parent_id
from myTable
connect by prior id = parent_id start with name = \'manager\'
group by id,parent_id
order by parent_id asc
但是我希望结果以树状结构返回。因此,每次找到父行时,其子行将直接显示在其下方。然后移到下一个父对象并执行相同操作
预期成绩
- Parent A
- child a
- child b
- Parent B
- child c
- child d
实际结果
- Parent A
- Parent B
- child a
- child b
- child c
- child d
是否可以在oracle中执行此操作?我的表使用parent_id字段来标识行何时具有父级。每行还有一个排序顺序,这是应该在其父项和唯一ID下排序的顺序。
我正在使用Oracle数据库
解决方法
您想要使用use3ѭ。您所查询的排序是按
parent_id
列进行的,该列将覆盖所有层次结构的排序。
下面的查询应执行所需的操作:
with my_hierarchy_data as (
select 1 as id,null as parent_id,\'Manager\' as name from dual union all
select 2 as id,1 as parent_id,\'parent 1\' as name from dual union all
select 3 as id,\'parent 2\' as name from dual union all
select 4 as id,2 as parent_id,\'child 1\' as name from dual union all
select 5 as id,\'child 2\' as name from dual union all
select 6 as id,3 as parent_id,\'child 3\' as name from dual union all
select 7 as id,\'child 4\' as name from dual
)
select id,parent_id,lpad(\'- \',level * 2,\' \') || name as name
from my_hierarchy_data
connect by prior id = parent_id
start with name= \'Manager\'
order siblings by parent_id asc
,在Oracle层次查询中可以使用一个特殊值“ 6”。它为层次结构顶层的行返回1,为其子级返回2,依此类推。您可以使用它来创建缩进,如下所示:
select lpad(\'- \',level*2,\' \') || name
from myTable
connect by prior id = parent_id start with name = \'manager\'
group by id,parent_id