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