javaproject積累——樹形結構的操做

        近期一直被樹形結構整的很是頭大,又是遞歸。又是循環。但是,好在咱們在經歷了千辛萬苦後。最終弄出來了。事實上就是組織機構的常規操做,有些是咱們過分設計。有些是咱們想錯了。而對數的邏輯讀取,咱們就屬於想錯了的類型。今天拿出來和你們分享。主要是樹形結構在數據庫的讀取問題!sql

原始:

        在最開始。咱們對樹的查詢,確定是從最簡單的select開始。咱們現在回想一下:數據庫

定義:

        表名:tb_tree網絡

        字段:id(主鍵),title(標題),parentId(父節點id)oracle


舉例:

一、查找樹中的所有頂級父節點(輩份最長的人)。 若是這個樹是個文件夾結構。那麼第一個操做老是找出所有的頂級節點,再依據該節點找到其下屬節點。spa


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

二、查找一個節點的直屬子節點(所有兒子)。 假設查找的是直屬子類節點。也是不用用到樹型查詢的。
設計

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

遞歸:

簡單介紹:

        通過一段時間的維護,咱們發現。當咱們處理的邏輯複雜時,咱們和數據庫就會與屢次交互。而這是不符合網絡交互的現狀的,咱們仍是但願,儘可能經過一次交互。傳遞不少其它的信息,下降對帶寬的壓力。通過多方討論,咱們發現Oracle事實上已經作了這個工做,咱們一塊兒來看看:code

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


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

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




ip

舉例:

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

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

這個查找的是id爲1的節點下的所有直屬子類節點,包含子輩的和孫子輩的所有直屬節點。

  

二、查找一個節點的直屬父節點(父親)。

假設查找的是節點的直屬父節點。也是不用用到樹型查詢的。


--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


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

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


四、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;


總結:

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

相關文章
相關標籤/搜索