在ORACLE 數(shù)據(jù)庫(kù)中有一種方法可以實(shí)現(xiàn)級(jí)聯(lián)查詢
select * //要查詢的字段
from table //具有子接點(diǎn)ID與父接點(diǎn)ID的表
start with selfid=id //給定一個(gè)startid(字段名為子接點(diǎn)ID,及開(kāi)始的ID號(hào))
connect by prior selfid=parentid //聯(lián)接條件為子接點(diǎn)等于父接點(diǎn),不能反
這個(gè)SQL主要用于菜單的級(jí)聯(lián)查詢,給一個(gè)父接點(diǎn)可以查出所有的子接點(diǎn)。及子接點(diǎn)的子接點(diǎn),一查到底,很實(shí)用。不過(guò)呢這個(gè)程序只能在oracle里面用,我目前還不知道在其它數(shù)據(jù)庫(kù)里是怎么調(diào)用的。等我找到了,再貼出來(lái)與大家分享。
這個(gè)程序,估計(jì)好多人看不明白,其實(shí)放了這么久我也一時(shí)沒(méi)看明白,重新測(cè)了一下,補(bǔ)充說(shuō)明一下,不然我下次又看不懂了。
以一個(gè)windows系統(tǒng)的菜單為例。我那一個(gè)這樣的表menu。
說(shuō)明:
mid:菜單的ID號(hào)
mname:菜單名稱
mpid:菜單的
quickey:快捷鍵
validate:權(quán)限表(存放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 |
|
|
如果我想知道在“文件”菜單下有那些子菜單的話。我就可以這樣用這個(gè)SQL程序:
select * from menu
start with mid=1
connect by prior mid=mpid;
這樣就可以把 “文件”里的子菜單全部列出來(lái)了。當(dāng)然實(shí)際應(yīng)用不會(huì)這么簡(jiǎn)單,如附加其實(shí)條件,尤其是權(quán)限管理,這時(shí)根據(jù)你的系統(tǒng)要求,是對(duì)個(gè)個(gè)驗(yàn)證,還是對(duì)角色驗(yàn)證,把這些人的ID放在validate這個(gè)字段里,組成一個(gè)字符串,N個(gè)ID用逗號(hào)隔開(kāi),(注意,在往數(shù)據(jù)庫(kù)保存時(shí)要注意對(duì)字符串處理一下,截取掉最后一個(gè)逗號(hào)這樣可以節(jié)省很多麻煩)
select * from menu
where validate in(……)
and mid in(
select mid from menu //這里不能用*號(hào)了。
start with mid=1
connect by prior mid=mpid;
)
最后再補(bǔ)充一點(diǎn)關(guān)于隨機(jī)查詢的代碼
select * from user order by sys_guid()
posted on 2015-03-12 12:04
ForMeBlog 閱讀(1478)
評(píng)論(0) 編輯 收藏 所屬分類:
數(shù)據(jù)庫(kù)