ORACLE級聯查詢

在ORACLE 數據庫中有一種方法可以實現級聯查詢

select *                //要查詢的字段

from table              //具有子接點ID與父接點ID的表 

start with selfid=id      //給定一個startid(字段名爲子接點ID,及開始的ID號)

connect by prior selfid=parentid       //聯接條件爲子接點等於父接點,不能反

 

這個SQL主要用於菜單的級聯查詢,給一個父接點可以查出所有的子接點。及子接點的子接點,一查到底,很實用。不過呢這個程序只能在oracle裏面用,我目前還不知道在其它數據庫裏是怎麼調用的。等我找到了,再貼出來與大家分享。

這個程序,估計好多人看不明白,其實放了這麼久我也一時沒看明白,重新測了一下,補充說明一下,不然我下次又看不懂了。

以一個windows系統的菜單爲例。我那一個這樣的表menu。

說明:

mid:菜單的ID號

mname:菜單名稱

mpid:菜單的

quickey:快捷鍵

validate:權限表(存放userid,或者角色id)

mid

mname

mpid

quickey

validate                                                                  

1

文件

 

ctrl+f

1,2,3,4,11,23,45

2

編輯

 

ctrl+e

 

3

新建

1

alt+w

 

4

文件夾

3

   

如果我想知道在“文件”菜單下有那些子菜單的話。我就可以這樣用這個SQL程序:

select * from menu

start with mid=1     

connect by prior mid=mpid;

這樣就可以把 “文件”裏的子菜單全部列出來了。當然實際應用不會這麼簡單,如附加其實條件,尤其是權限管理,這時根據你的系統要求,是對個個驗證,還是對角色驗證,把這些人的ID放在validate這個字段裏,組成一個字符串,N個ID用逗號隔開,(注意,在往數據庫保存時要注意對字符串處理一下,截取掉最後一個逗號這樣可以節省很多麻煩)

select * from menu

where validate in(……)

and mid in(

   select mid from menu  //這裏不能用*號了。

   start with mid=1     

   connect by prior mid=mpid;

)

最後再補充一點關於隨機查詢的代碼

select * from user order by sys_guid()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章