在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()