在oracle中通過connect by prior來實現遞迴查詢

來源:互聯網
上載者:User

connect by 是結構化查詢中用到的,其基本文法是:
select ... from tablename start by cond1
connect by cond2
where cond3;
簡單說來是將一個樹狀結構儲存在一張表裡,比如一個表中存在兩個欄位:
id,parentid那麼通過表示每一條記錄的parent是誰,就可以形成一個樹狀結構。
用上述文法的查詢可以取得這棵樹的所有記錄。
其中COND1是根結點的限定語句,當然可以放寬限定條件,以取得多個根結點,實際就是多棵樹。
COND2是串連條件,其中用PRIOR表示上一條記錄,比如 CONNECT BY PRIOR ID=PRAENTID就是說上一條記錄的ID是本條記錄的PRAENTID,即本記錄的父親是上一條記錄。
COND3是過濾條件,用於對返回的所有記錄進行過濾。

PRIOR和START WITH關鍵字是可選項
PRIORY運算子必須放置在串連關係的兩列中某一個的前面。對於節點間的父子關係,PRIOR
運算子在一側表示父節點,在另一側表示子節點,從而確定尋找樹結構是的順序是自頂向下還是
自底向上。在串連關係中,除了可以使用列名外,還允許使用列運算式。START WITH 子句為
可選項,用來標識哪個節點作為尋找樹型結構的根節點。若該子句被省略,則表示所有滿足查詢
條件的行作為根節點。
完整的例子如SELECT PID,ID,NAME FROM T_WF_ENG_WFKIND START WITH PID =0 CONNECT BY PRIOR ID = PID

以上主要是針對上層對下層的順向遞迴查詢而使用start with ... connect by prior ...這種方式,但有時在需求需要的時候,可能會需要由下層向上層的逆向遞迴查詢,此是語句就有所變化:例如要實現 select * from table where id in ('0','01','0101','0203','0304') ;現在想把0304的上一級03給遞迴出來,0203的上一級02給遞迴出來,而01現在已經是存在的,最高層為0.而這張table不僅僅這些資料,但我現在只需要('0','01','0101','0203','0304','02','03')這些資料,此時語句可以這樣寫SELECT PID,ID,NAME FROM V_WF_WFKIND_TREE WHERE ID IN (SELECT DISTINCT(ID) ID FROM V_WF_WFKIND_TREE CONNECT BY PRIOR PID = ID START WITH ID IN ('0','01','0101','0203','0304') );

其中START WITH ID IN裡面的值也可以替換SELECT 子查詢語句.

本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/apicescn/archive/2007/02/16/1510922.aspx

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.