標籤:blog http ar io os sp on div art
--本文章可以直接粘貼到PLSQL運行,測試表就自己建立吧--測試名稱:測試oracle遞迴 --oracle版本:oracle8i--樣表:s_coalarea_test(地區表)--表結構:國家 level(等級) 1 level決定記錄在樹中的層次-- 省份 level(等級) 2-- 地區 level(等級) 3-- 依次類推--備忘:這張地區表是一顆樹,遞迴查詢主要就是方便維護樹
--測試1:簡單遞迴 --需求:根據地區名稱查詢其所有的下級地區名稱 --備忘:aid是表主鍵,parentid是父節點主鍵,areaname地區名稱 --分析:遞迴查詢其實還是一個條件過濾 select s.areaname from s_coalarea_test s start with --start with 是遞迴入口,也就是遞迴的起始位置 s.areaname =‘黑龍江‘ --指明允入準則 connect by prior --prior 前序走訪 指明遍曆方向 入不寫 預設不遞迴查詢 s.aid=s.parentid --級聯條件 也就是你的樹通過哪個欄位相連的 順序決定查詢結果 須注意
--測試2:談遞迴入口 start with --需求:根據多個地區名查詢器所有下級地區 select s.areaname from s_coalarea_test s start with s.areaname =‘黑龍江‘ --遞迴入口可以是多個值,其原理:先根據start with過濾記錄 or --然後根據過濾後的記錄,依次遞迴遍曆結果 s.areaname=‘山西‘ connect by prior s.aid=s.parentid
--測試3:再談遞迴入口 --需求:根據多個地區名查詢器所有下級地區 --錯誤:測試結果讓人惱火,原來start with先於where執行,所以這個測試很失敗,大家要注意 select s.areaname from s_coalarea_test s where s.areaname=‘黑龍江‘ or s.areaname = ‘山西‘ start with s.areaname = s.areaname --既然start with只是過濾記錄,那麼當然我們也可以不在此處過濾,而直接用where過濾的結果了 connect by prior s.aid=s.parentid
--測試4:談級聯條件 --需求:根據地區名,查詢上級地區 select s.areaname from s_coalarea_test s start with s.areaname=‘大同‘ connect by prior s.parentid=s.aid --注意,此時僅僅是級聯條件順序改變了 --總結:到底是查父節點還是子節點,有級聯順序決定 --規律:【本記錄欄位】=【串連欄位】 --如本執行個體:是通過本記錄的parentid匹配其他記錄的aid(主鍵)結果是查父節點 -- 如順序顛倒,則是:有本記錄的aid(主鍵)匹配其他記錄的parentid,結果是查子節點 --測試5:遞迴關鍵字出現的位置 --需求:根據地區名稱尋找其所在省份
select s.areaname from s_coalarea_test s where s.arealevel=1 --對遍曆結果進行過濾 start with --start with 必須出現在where之後,但是可以是where and之間 入下例 s.areaname=‘大同‘ connect by prior s.parentid=s.aid
--測試5:繼續談遞迴關鍵字出現的位置 --需求:根據地區名稱尋找其所在省份
select s.areaname from s_coalarea_test s where s.arealevel=1 --對遍曆結果進行過濾 start with --start with 之前不需要加and s.areaname=‘大同‘ connect by prior s.parentid=s.aid and s.arealevel=1 - --where的過濾條件
group by s.areaname --既然遞迴查詢也是過濾條件 當然可以跟group by
order by s.areaname --既然遞迴查詢也是過濾條件 當然可以跟order by
--總結:start with ...connect by prior 遞迴查詢也是對結果過濾,類似where過濾,先於where過濾執行 http://my.oschina.net/lovedreamland/blog/90284
oracle 遞迴查詢