[英]sql nested query - group results by parent
我需要從單個表中返回樹狀結果。 目前我使用 connect by 和 start with 以確保返回所有正確的結果。
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 數據庫
你想要的是使用ORDER SIBLINGS BY
。 您擁有的查詢是按覆蓋任何分層排序的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, 1 as parent_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, 2 as parent_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, 3 as parent_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 分層查詢中可以使用一個特殊的值level
。 它為層次結構頂層的行返回 1,為其子行返回 2,依此類推。 您可以使用它來創建這樣的縮進:
select lpad('- ',level*2,' ') || name
from myTable
connect by prior id = parent_id start with name = 'manager'
group by id, parent_id
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.