oracle 層次查詢

2021-08-10 06:14:38 字數 3214 閱讀 4637

1、簡介:oracle層次化查詢是oracle特有的功能實現,主要用於返回乙個資料集,這個資料集存在樹的關係(資料集中存在乙個pid記錄著當前資料集某一條記錄的id)。

2、層次化查詢主要包含兩個子句,乙個start with另乙個是connect by。

start with:這個子句一般用於指定層次化查詢的開始節點(也就是樹的最頂級節點),找到最頂級節點,然後按照一定的規則開始查詢其剩餘的子節點

connect by:這個子句就是上面所說的規則,用於查詢剩餘子節點的規則

下面開始執行層次化查詢,從pid為null的節點(該節點為根節點)開始遞迴查詢,查詢出所有的更節點下的子節點,構建出乙個完整的樹

**解析:

(1)、start with pid is null  指定層次化查詢的根節點,

紅框內的兩個節點為根節點,並開始遍歷其餘的節點。

(2)、connect by prior id=pid  當前節點的pid等於上一層節點的id,如果滿足條件,就加入到樹結果集中

指定遍歷查詢子節點的規則----->  這一過程是遞迴查詢,會一層一層找下去,直到不符合這一規則,則查詢停止。

3、實現上面結果集的另一種sql實現

結論:根節點的定義比較靈活,但是(connect by)遍歷子節點的規則,比較固定基本都是判斷父節點和子節點的id的,如果理解了這句話,層次化查詢,差不多也就理解了!

4、  oracle sql 中的層次化查詢會檢測資料中是否存在回環(死迴圈),如果存在回環,則會丟擲 ora-01436: connect by loop in user data . 的錯誤。如果在 connect by 後面加上 nocycle 

則 產生回環的最後一層的節點會被刪除。

如果資料中出現這種情況,產生了回環,那麼在connect by 後面 加nocycle,節能

just沒有報錯,有點鬱悶,並沒有刪除,不知道**出了問題,但是至少不抱錯了!!!

5、oracle 還為層次化查詢提供了一些偽列( pseudo column )。

(1)、connect_by_iscycle 當這一行有乙個子節點同時也是它的祖先節點時返回 1 ,否則返回 0 。

(2)、connect_by_isleaf 當這一行是葉節點時返回 1 ,否則返回 0 。偽列 level 返回這一行在樹中的層次,根為第一層。

(3)、connect_by_root 查詢操作符可以加在 connect by 之後的某個字段之前,表示獲得這一行的根節點的該字段的值。

6、層次化查詢還支援乙個特殊的函式 sys_connect_by_path , sys_connect_by_path ( exp , char ),這個函式返回從根節點到這一行計算其中每個exp 表示式的值,並把它們連線成字串,每個節點之間用 char 字元來分割。下面是乙個例子。

這個函式很棒,可以考慮其他的資料庫也實現這個方法,這樣我們處理乙個樹結構就很方便了!!!

oracle層次查詢

層次查詢 hierarial retrival 1.層次查詢基本概念 層次查詢是描敘乙個樹狀結構,我們可以通過層次查詢來控制自上而下,或者自下而上的查詢樹狀資料。並且還可以確定查詢起始點 start with確定開始點 connect by確定遍歷的方向。2.層次查詢語法 select level ...

oracle的層次查詢

語法 select 列名次from 表名次 where 條件 start with 條件connect by prior 當前表這段 級聯表字段。解釋 where 條件為可選,start with 條件connect by prior 語句完成遞迴查詢,形成一棵樹形結構。start with 表示開...

理解oracle層次查詢

作為一名開發和管理兼修的工程師,有時候會遇到編寫複雜的sql 此時就會查詢資料,事後又很快會忘記。記得自己每次編寫層次結構的時候都會找資料,到底誰是父親,誰是孩子,prior放在那邊代表什麼意思。今天主要把層次的語法進行分析,並用自己的理解記住自頂向下和自底向上。基本語法很簡單 select fro...