熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

oracle|connectbyprior|遞歸查詢

2013-11-13 16:06:06  來源: Oracle 

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

  select from tablename start by cond

  connect by cond

  where cond;

  簡單說來是將一個樹狀結構存儲在一張表裡比如一個表中存在兩個字段:

  idparentid那麼通過表示每一條記錄的parent是誰就可以形成一個樹狀結構

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

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

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

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

  PRIOR和START WITH關鍵字是可選項

  PRIORY運算符必須放置在連接關系的兩列中某一個的前面對於節點間的父子關系PRIOR

  運算符在一側表示父節點在另一側表示子節點從而確定查找樹結構是的順序是自頂向下還是

  自底向上在連接關系中除了可以使用列名外還允許使用列表達式START WITH 子句為

  可選項用來標識哪個節點作為查找樹型結構的根節點若該子句被省略則表示所有滿足查詢

  條件的行作為根節點

  完整的例子如SELECT PIDIDNAME FROM T_WF_ENG_WFKIND START WITH PID = CONNECT BY PRIOR ID = PID

  以上主要是針對上層對下層的順向遞歸查詢而使用start with connect by prior 這種方式但有時在需求需要的時候可能會需要由下層向上層的逆向遞歸查詢此是語句就有所變化:例如要實現 select * from table where id in () ;現在想把的上一級給遞歸出來的上一級給遞歸出來現在已經是存在的最高層為而這張table不僅僅這些數據但我現在只需要()這些數據此時語句可以這樣寫SELECT PIDIDNAME 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 () );

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

  注意由上層向下層遞歸與下層向上層遞歸的區別在於START WITHCONNECT BY PRIOR的先後順序以及 ID = PID 和 PID = ID 的微小變化!


From:http://tw.wingwit.com/Article/program/Oracle/201311/17809.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.