1. 程式人生 > >java工程積累——樹形結構的操作

java工程積累——樹形結構的操作

        最近一直被樹形結構整的很頭大,又是遞迴,又是迴圈,但是,好在我們在經歷了千辛萬苦後,終於弄出來了,其實就是組織機構的常規操作,有些是我們過度設計,有些是我們想錯了,而對數的邏輯讀取,我們就屬於想錯了的型別,今天拿出來和大家分享,主要是樹形結構在資料庫的讀取問題!

原始:

        在最開始,我們對樹的查詢,肯定是從最簡單的select開始,我們現在回顧一下:

定義:

        表名:tb_tree

        欄位:id(主鍵),title(標題),parentId(父節點id)

舉例:

1、查詢樹中的所有頂級父節點(輩份最長的人)。 假設這個樹是個目錄結構,那麼第一個操作總是找出所有的頂級節點,再根據該節點找到其下屬節點。

select * from tb_tree m where m.parent is null;

2、查詢一個節點的直屬子節點(所有兒子)。 如果查詢的是直屬子類節點,也是不用用到樹型查詢的。

select * from tb_tree m where m.parent=1;

遞迴:

簡介:

        經過一段時間的維護,我們發現,當我們處理的邏輯複雜時,我們和資料庫就會與多次互動,而這是不符合網路互動的現狀的,我們還是希望,儘量通過一次互動,傳遞更多的資訊,減少對頻寬的壓力,經過多方討論,我們發現Oracle其實已經做了這個工作,我們一起來看看:

        我們經過不斷的探索,發現oracle樹查詢的最重要的就是select…start with…connect by…prior語法了。依託於該語法,我們可以將一個表形結構以樹的順序列出來。

1、start with id= 是定義起始節點(種子),可以是id也可以是root_id,定義為root_Id查詢該節點下所有的樹結構,定義為id(子節點)則查詢指定的樹

2、connect by prior :prior的含義為先前,前一條記錄。prior id=root_id 也就是前一條記錄的id等於當前記錄的root_id(父id)




舉例:

1、查詢一個節點的所有直屬子節點(所有後代)。

select * from tb_menu m start with m.id=1 connect by m.parent=prior m.id;

這個查詢的是id為1的節點下的所有直屬子類節點,包括子輩的和孫子輩的所有直屬節點。

2、查詢一個節點的直屬父節點(父親)。 如果查詢的是節點的直屬父節點,也是不用用到樹型查詢的。

--c-->child, p->parent
select c.id, c.title, p.id parent_id, p.title parent_title
from tb_menu c, tb_menu p
where c.parent=p.id and c.id=6


3、查詢一個節點的所有直屬父節點(祖宗)。

select * from tb_menu m start with m.id=38 connect by prior m.parent=m.id;
4、level欄位為oracle特有的層級欄位,可以通過level欄位查詢指定的層級
select root_id,id,name,level from t2 where level=1
 start with root_id = 0 
connect by prior id = root_id;

總結:

        通過這幾天的觀察,我們發現,集體的智慧永遠是最強大的,每個人貢獻一點點,我們就能將問題的解決方案在設計之初就升級到一個客觀的程度,包括這次的樹形結構的研究,相信你的隊友不論他在你心理到底是什麼狀態,他既然被招進公司,肯定有他的閃光點打動了人力部門,且還有一句話,高手在民間,這句話,已經多次被驗證了!