2013-04-16 14 views
0

我有一個Oracle表看起來像這樣:使用connect_by得到一個節點的深度在Oracle數據庫中的表一棵樹

模式:

(數量)NODE_ID

(數字) PARENT_ID

(號碼)parent_seq

表中的每一條目表示單個父/子關係。父母可以是多個孩子的父母,孩子可以有多個父母(但是我們可以假定沒有任何週期存在,因爲在提交之前已驗證)。如果一個孩子有多個父母,那麼它將有多於一行對應其表中的node_id,parent_seq將爲每個父母增加。

現在,我不需要重建整個樹,我只需要知道每個節點的深度。深度以下的(What is the difference between tree depth and height?)共同定義

一個節點的深度是從節點到該樹的 根節點的邊的數量。

有沒有一種方法可以在Oracle中使用CONNECT_BY語法優雅地執行此操作?

+0

暫無評論點擊這裏 –

回答

1

我相信我找到了答案,這是在文檔中。關鍵字「LEVEL」是在執行connect_by語句時顯示節點級別的列。所以,你只需給定節點的最高水平:

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

1
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 

fiddle