在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()
posted on 2015-03-12 12:04
ForMeBlog 阅读(1461)
评论(0) 编辑 收藏 所属分类:
数据库