Oracle--樹形自關聯表查詢SQL

來源:互聯網
上載者:User

標籤:必須   結果   基本用法   開始   不用   檢索   rom   start   兄弟節點   

平時會經常用到自關聯的樹形結構表來儲存樹形結構的資料,資料之間的層次聯絡代表著樹形結構中的父子關係,並通常用表中兩個列間的聯絡來描述,如下表中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 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、前序走訪

樹形查詢子句是遞迴處理過程,樹的根節點向分葉節點遞迴查詢時,遍曆順序是按照樹的前序走訪進行的。

Oracle--樹形自關聯表查詢SQL

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.