Oracle遞迴查詢

2021-07-04 01:26:16 字數 2661 閱讀 7522

--本文章可以直接貼上到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:再談遞迴入口 

--需求:根據多個地區名查詢器所有下級地區

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過濾執行

oracle 遞迴查詢 Oracle遞迴查詢

1.1 建立表與插入資料 create table district id number 10 not null,parent id number 10 name varchar2 255 byte not null alter table district add constraint distr...

oracle 逆向遞迴查詢 oracle遞迴查詢

oracle的遞迴查詢 最近在看公司的oa系統,oa系統中基本都會有節點樹,其中對於樹上的資料展示,就是用了資料庫的遞迴查詢,在這裡總結下遞迴查詢。現在存在如下的一棵樹 不會畫樹,將就一下,該樹對應下面建立的表資料。建立如下表 create table dg id number not null,主...

oracle 逆向遞迴查詢 Oracle遞迴查詢

start with.connect by子句遞迴查詢一般用於乙個表維護樹形結構的應用。建立示例表 create table tbl test id number,name varchar2 100 byte pid number default 0 插入測試資料 insert into tbl t...