Oracle中start with...connect by prior子句用法.doc

531968912發表於2016-07-14
 今天發現在oracle中的select語句可以用START WITH...CONNECT BY PRIOR子句實現遞迴查詢,connect by 是結構化查詢中用到的,其基本語法是:

select ... from tablename start with cond1
connect by cond2
where cond3;

簡單說來是將一個樹狀結構儲存在一張表裡,比如一個表中存在兩個欄位:
id,parentid
那麼透過表示每一條記錄的parent是誰,就可以形成一個樹狀結構。

用上述語法的查詢可以取得這棵樹的所有記錄。

其中COND1是根結點的限定語句,當然可以放寬限定條件,以取得多個根結點,實際就是多棵樹。

COND2是連線條件,其中用PRIOR表示上一條記錄,比如 CONNECT BY PRIOR ID=PRAENTID就是說上一條記錄的ID是本條記錄的PRAENTID,即本記錄的父親是上一條記錄。

COND3是過濾條件,用於對返回的所有記錄進行過濾。

對於oracle進行簡單樹查詢(遞迴查詢)

DEPTID

PAREDEPTID

NAME

NUMBER

NUMBER

CHAR (40 Byte)

部門id

父部門id(所屬部門id)

部門名稱

透過子節點向根節點追朔.

Sql程式碼

select  *  from  persons.dept  start  with  deptid=76  connect  by prior  paredeptid=deptid   

透過根節點遍歷子節點.

Sql程式碼

Select * from persons.dept start with deptid=0 connect by prior deptid=partdeptid

可透過level 關鍵字查詢所在層次.

Sql程式碼

  1. select a.*,level from persons.dept a start with paredeptid=0 connect by prior deptid=paredeptid   

再次複習一下:start with ...connect by 的用法, start with 後面所跟的就是就是遞迴的種子。

遞迴的種子也就是遞迴開始的地方 connect by 後面的"prior" 如果預設:則只能查詢到符合條件的起始行,並不進行遞迴查詢;

connect by prior 後面所放的欄位是有關係的,它指明瞭查詢的方向。

練習: 透過子節點獲得頂節點

  1. select FIRST_VALUE(deptid) OVER (ORDER BY LEVEL DESC ROWS UNBOUNDED PRECEDING) AS firstdeptid from persons.dept start with deptid=76 connect by prior paredeptid=deptid  

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25462274/viewspace-2122025/,如需轉載,請註明出處,否則將追究法律責任。

相關文章