平時會經常用到自關聯的樹形結構表來存儲樹形結構的資料,資料之間的層次聯系代表着樹形結構中的父子關系,并通常用表中兩個列間的聯系來描述,如下表中ID 和 PARENT_ID,ID為家族成員編号,PARENT_ID為父母編号,進而可以形成一個樹形結構的家族關系。

一、基本用法
基本語句:select ··· from ··· connect by prior ··· start with ··· order siblings by ···
如家族樹的表查詢語句為:
select * from family_tree connect by prior id = parent_id start with appellation = '爺爺' order siblings by age desc
查詢結果如下:(從‘爺爺’開始往子孫後代周遊查詢,并且兄弟節點間按年齡由大到小排序)
二、connect by & where 剪枝和去點
connect by 表明每行資料将是按層次順序檢索,并規定了按照什麼規則将資料進行關聯。
不僅如此connect by 還可以限制查詢的分支,通過限制條件進行剪枝:還是之前的查詢,但這次要求不查詢 '小姑' 及其子女
select * from family_tree connect by prior id = parent_id and appellation <> '小姑' start with appellation = '爺爺' order siblings by age desc
查詢結果如下:還是之前的查詢,但這次要求不查詢 '小姑' 及其子女
若隻想不查詢 '小姑' 但其子女還是需要查詢的,則需要使用 where 進行限制,也就是隻去除單個或多個節點:
select * from family_tree where appellation <> '小姑' connect by prior id = parent_id start with appellation = '爺爺' order siblings by age desc
查詢結果如下:'小姑' 節點被去掉了,而其子女節點仍然還在。
where 子句不能在 connect by 子句的後面,否則會報錯。
三、關于prior
prior需要和connect by 一起使用,且必須放置在 連結關系的兩列中某一列的前面,用來标記哪一列是 '子辨別'。進而決定了檢索的順序。
若prior放在 '子辨別' 的前面則檢索順序是按照由上自下(由根到葉)的順序檢索。(這時SQL語句辨別到了正确的 '子辨別')
若prior放在 '父辨別' 的前面則檢索順序是按照自下而上(由葉到根)的順序檢索。(這時SQL語句辨別到了錯誤的 '子辨別',并将 '父辨別' 錯認為了 '子辨別' 是以檢索方向正好相反了)
如,下面的語句,将prior 放在 parent_id(父辨別) 前,則檢索方向就是子孫向爺爺檢索。
select * from family_tree connect by id = prior parent_id start with appellation = '表弟' order siblings by age desc
查詢結果如下:
四、start with 定義查找起始節點
start with 子句規定了從哪個或哪些節點開始檢索樹。若start with 子句被省略了,則所有的節點都是起始節點。
如,下面的語句就隻查詢以 '大伯' 和 '小姑' 為起始節點的分支。
select * from family_tree connect by prior id = parent_id start with appellation = '大伯' or appellation = '小姑' order siblings by age desc
查詢結果如下:
五、order siblings by 同層級的兄弟節點間的排序
order siblings by 顧名思義是同層級的兄弟節點間的排序,上面的語句中有都用到了這樣的排序。
select * from family_tree connect by prior id = parent_id start with appellation = '爺爺' order siblings by age asc
查詢結果:
同樣的,order by 子句也是可以應用的,但是所有節點一起排序,這樣會打亂樹形結構
select * from family_tree connect by prior id = parent_id start with appellation = '爺爺' order by age asc
六、僞列 level
level 需要和connect by 子句一起使用表示節點在樹結構中的層級,根節點為 1,根節點的子節點為 2,依次類推。這裡的根節點是 start with 限制的起始節點。
如下語句:
select level, T.* from family_tree T connect by prior id = parent_id start with appellation = '爺爺' order by age desc
查詢結果如下,包括了 level字段
七、子句執行順序:from --> start with --> connect by --> where --> select --> order by
PS:
1、where 是在 connect by 後執行的(雖然寫法是需要寫在前面),是以 where 才有隻去節點不剪分支(在樹形關系結構都查詢出來後,才通過 where 進行限制篩選)。
2、order by 是最後才執行,是以使用order by 不用 order siblings by 會打亂已有的樹形結構檢索,隻按 order by 子句排序。
8、前序周遊
樹形查詢子句是遞歸處理過程,樹的根節點向葉節點遞歸查詢時,周遊順序是按照樹的前序周遊進行的。
轉載于:https://www.cnblogs.com/Aoobruce/p/8779716.html