【轉】oracle connect by用法

今天偶然看到connect by,但記不太清楚具體用法了。轉了個博客(寫的蠻好的),看成筆記。

http://www.cnblogs.com/linjiqin/p/3152690.htmlhtml

 

先用scott用戶下的emp表作實驗.

emp表有個字段,一個是empno(員工編號),另外一個是mgr(上級經理編號)
下面是表中全部數據java

1
select  * from  emp start with  empno=7698 connect  by   mgr= prior  empno;

執行結果以下:sql

獲得的結果是empno=7698的數據,以及會獲得mgr=7698的數據。
它是向下遞歸的, 即咱們從empno=7698開始遍歷,去找出mgr=7698的全部數據S(用S表明查出的全部數據.), 而後在從S中的empno的值去匹配查找是否還有知足,mgr in (s.empno)的數據。一直遍歷進去到沒有數據爲止。 post

 下面的這個能夠詳細的表述效果。spa

1
2
--向下遞歸遍歷
select  * from  emp connect  by  mgr= prior  empno start with  empno=7839;

執行結果以下:code

1
2
--向上遞歸遍歷
select * from emp connect by prior mgr=empno start with empno= 7844 ;

執行結果以下:htm

這樣直到沒有匹配的數據爲止。
以上只是簡單的舉了個例子。blog

connect by是結構化查詢中用到的,其基本語法是:遞歸

1
2
3
4
select  ... from  tablename
start by  cond1
connect  by  cond2
where  cond3

簡單說來是將一個樹狀結構存儲在一張表裏,好比一個表中存在兩個字段(如emp表中的empno和mgr字段):empno, mgr那麼經過表示每一條記錄的mgr是誰,就能夠造成一個樹狀結構。ci

用上述語法的查詢能夠取得這棵樹的全部記錄。其中:cond1是根結點的限定語句,固然能夠放寬限定條件,以取得多個根結點,實際就是多棵樹。cond2是鏈接條件,其中用prior表示上一條記錄,好比connect by prior id=praentid就是說上一條記錄的id是本條記錄的praentid,即本記錄的父親是上一條記錄。cond3是過濾條件,用於對返回的全部記錄進行過濾。prior和start with關鍵字是可選項prior運算符必須放置在鏈接關係的兩列中某一個的前面。對於節點間的父子關係,prior運算符在一側表示父節點,在另外一側表示子節點,從而肯定查找樹結構是的順序是自頂向下仍是自底向上。在鏈接關係中,除了可使用列名外,還容許使用列表達式。start with子句爲可選項,用來標識哪一個節點做爲查找樹型結構的根節點。若該子句被省略,則表示全部知足查詢條件的行做爲根節點。

相關文章
相關標籤/搜索