簡體   English   中英

sql 嵌套查詢 - 按父級分組結果

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM