平時會經常用到自關聯的樹形結構表來儲存樹形結構的資料,資料之間的層次聯絡代表著樹形結構中的父子關係,並通常用表中兩個列間的聯絡來描述,如下表中id 和 parent_id,id為家族成員編號,parent_id為父母編號,從而可以形成乙個樹形結構的家族關係。
一、基本用法
基本語句:select ··· from ··· connect by prior ··· start with ··· order siblings by ···
如家族樹的表查詢語句為:
select*fromfamily_treeconnect by priorid = parent_idstart withagedesc
查詢結果如下:(從『爺爺』開始往子孫後代遍歷查詢,並且兄弟節點間按年齡由大到小排序)
二、connect by & where 剪枝和去點
connect by 表明每行資料將是按層次順序檢索,並規定了按照什麼規則將資料進行關聯。
不僅如此connect by 還可以限制查詢的分支,通過限制條件進行剪枝:還是之前的查詢,但這次要求不查詢 '小姑' 及其子女
select*fromfamily_treeconnect by prior<> '小姑'start withagedesc
查詢結果如下:還是之前的查詢,但這次要求不查詢 '小姑' 及其子女
若只想不查詢 '小姑' 但其子女還是需要查詢的,則需要使用 where 進行限制,也就是只去除單個或多個節點:
select*fromfamily_treewhere<> '小姑'connect by priorid = parent_idstart withagedesc
查詢結果如下:'小姑' 節點被去掉了,而其子女節點仍然還在。
where 子句不能在 connect by 子句的後面,否則會報錯。
三、關於prior
prior需要和connect by 一起使用,且必須放置在 鏈結關係的兩列中某一列的前面,用來標記哪一列是 '子標識'。從而決定了檢索的順序。
若prior放在 '子標識' 的前面則檢索順序是按照由上自下(由根到葉)的順序檢索。(這時sql語句標識到了正確的 '子標識')
若prior放在 '父標識' 的前面則檢索順序是按照自下而上(由葉到根)的順序檢索。(這時sql語句標識到了錯誤的 '子標識',並將 '父標識' 錯認為了 '子標識' 所以檢索方向正好相反了)
如,下面的語句,將prior 放在 parent_id(父標識) 前,則檢索方向就是子孫向爺爺檢索。
select*fromfamily_treeconnect byid =priorparent_idstart withagedesc
查詢結果如下:
四、start with 定義查詢起始節點
start with 子句規定了從哪個或哪些節點開始檢索樹。若start with 子句被省略了,則所有的節點都是起始節點。
如,下面的語句就只查詢以 '大伯' 和 '小姑' 為起始節點的分支。
select*fromfamily_treeconnect bypriorid =parent_idstart withagedesc
查詢結果如下:
五、order siblings by 同層級的兄弟節點間的排序
order siblings by 顧名思義是同層級的兄弟節點間的排序,上面的語句中有都用到了這樣的排序。
select*fromfamily_treeconnect by priorid = parent_idstart withageasc
查詢結果:
同樣的,order by 子句也是可以應用的,但是所有節點一起排序,這樣會打亂樹形結構
六、偽列 level
level 需要和connect by 子句一起使用表示節點在樹結構中的層級,根節點為 1,根節點的子節點為 2,依次類推。這裡的根節點是 start with 限制的起始節點。
如下語句:
selectlevel, t.*fromfamily_tree tconnect by priorid = parent_idstart withagedesc
查詢結果如下,包括了 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、前序遍歷
樹形查詢子句是遞迴處理過程,樹的根節點向葉節點遞迴查詢時,遍歷順序是按照樹的前序遍歷進行的。
mysql單錶自關聯查詢
好久沒寫sql了,這個系統居然要求是全棧型別。從後到前都要做 我的js都忘光了 先記錄下乙個sql這塊吧。現在的需求是,查詢全部的資料,過濾條件是符合某個分類,返回時id,及其所推薦id,若果沒有,則返回null,如果推薦多條,和合併為一條用 分割。看了下,這錶資料不大,幾十萬條。符合條件的結果幾千...
Oracle樹形查詢
基本語法 select.from tabename start with cond1 connect by prior cond2 where cond2 注 cond1是根節點的限定語句 cond2是連線條件,其中prior表示上一條記錄,指該記錄的父親是上一條記錄 cond3是過濾條件 構造環境...
oracle 樹形查詢
1.1 簡單的樹形查詢 select empno as 員工編碼,ename as 姓名,mgr as 主管,prior ename as 主管姓名 1.2 根節點,分支節點,葉節點 level 返回所在的等級 connect by isleaf 如果當前節點下沒有其他節點返回1,其他返回0。sel...