在相關業務查詢中,我們常常遇到相關的上下級關系情況,如下圖中行政區划關聯,此時就要用到Oracle 提供的start with 關鍵字來幫助我們進行遞歸查詢
基本語法
SELECT ... FROM + 表名
START WITH + 條件1
CONNECT BY PRIOR + 條件2
WHERE + 條件3
條件1:是根節點的限定語句,當然可以放寬限定條件,以取得多個根節點,也就是多棵樹;在連接關系中,除了可以使用列明外,還允許使用列表達式。
START WITH 子句為可選項,用來標識哪個節點作為查找樹形結構的根節點。若該子句省略,則表示所有滿足查詢條件的行作為根節點。
條件2:是連接條件,其中用PRIOR表示上一條記錄,例如CONNECT BY PRIOR a_pid = a_id,意思就是上一條記錄的a_pid是本條記錄
的a_id,即本記錄的父親是上一條記錄。CONNECT BY子句說明每行數據將是按照層次順序檢索,並規定將表中的數據連入樹形結構的關系中。
PRIOR運算符必須放置在連接關系的2列中某一個的前面。對於節點間的父子關系,PRIOR運算符在一側表示父節點,在另一側表示子節點,從而確定查找樹結構的順序是自頂向下,還是自底向上。
條件3:是過濾條件,用於對返回的記錄進行過濾。
1,定義查找起始節點
在自頂向下查詢樹狀結構時,不但可以從根節點開始,還可以定義任何節點為起始節點,以此開始,向下查找。這樣查找的結果就是以該節點為開始的結構是樹的一枝。
例子:
在本例中如果我們想知道紅牌樓的所有上級機構,那么sql語句如下:
SELECT * FROM AreaMap
START WITH a_nam = '紅牌樓'
CONNECT BY PRIOR a_pid = a_id;
該sql語句執行結果為:
同理,我們想知道成都市 所有的下屬機構,則sql語句如下:
SELECT * FROM AreaMap
START WITH a_nam = '成都市'
CONNECT BY PRIOR a_id = a_pid;
該sql語句的執行結果如下: