簡體   English   中英

使用connect_by獲取Oracle DB表中樹中節點的深度

[英]Using connect_by to get the depth of a node in a tree in Oracle DB table

我有一個oracle表,看起來像這樣:

架構:

(編號)node_id

(編號)parent_id

(編號)parent_seq

表中的每個條目表示單個父/子關系。 父對象可以是多個子對象的父對象,子對象可以有多個父對象(但我們可以假設沒有循環存在,因為它在提交之前已經過驗證)。 如果一個子節點有多個父節點,那么它將具有與該節點中的node_id相對應的多個行,並且parent_seq將為每個父節點遞增。

現在,我不需要重建整個樹,我只需要知道每個節點的深度。 深度遵循以下常見定義( 樹深度和高度之間有什么區別?

節點的深度是從節點到樹的根節點的邊數。

有沒有辦法在Oracle中使用CONNECT_BY語法優雅地執行此操作?

我相信我找到了答案,就在文檔中。 關鍵字“LEVEL”是一個列,用於顯示執行connect_by語句時的節點級別。 所以你只需要給定節點的最大級別:

select node_id, max(LEVEL) from node_parent_link CONNECT BY PRIOR node_id = parent_id group by node_id

select
   node_id,
   min(level) as best_level,
   min(sys_connect_by_path(node_id, '/')) 
      keep (dense_rank first order by level) 
      as best_path
from t
start with parent_id is null
connect by prior node_id = parent_id
group by node_id
order by 1

小提琴

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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