设为首页 收藏本站
查看: 494|回复: 0

[经验分享] oracle 递归查询一个树形结构的菜单

[复制链接]
YunVN网友  发表于 2016-8-15 06:45:46 |阅读模式
关键字:oracle connect by level 树状结构表
定义如下id 和 名称描述
1— 省长 <--- 2,3 (省长管辖市长、县长)
2— 市长 <--- 5,6 (市长管辖模范村村长和一个平民)
3— 县长 <--- 4,7,8,9 (县长管辖镇长和三个平民)
4— 镇长 <--- 10,11,12,13 (管辖四个平民)
5— 村长 <--- 14,15 (管辖两个平民)
其他(6-15)— 平民(没有管辖任何人)

只有省长、市长县长能处理问题,那么每个人出了问题应该首先找谁来解决?
省长权利最大,自己出了问题自己解决,别人也没法知道; 可以认为在关系表里省长的父节点是自己。

Db代码 DSC0000.jpg





  • create table person(id int primary key, description varchar2(50));   
  • create table relationship(child int, parent int, primary key(child,parent));   

  • insert into person values(1,‘省长’);   

  • insert into person values(2,‘市长’);   

  • insert into person values(3,‘县长’);   

  • insert into person values(4,‘镇长’);   

  • insert into person values(5,‘村长’);   

  • insert into person values(6,‘平民’);   
  • ...//省略的都是平民   

  • insert into person values(15,‘平民’);   
  •   

  • insert into relationship values(1,1); //关系如下   

  • insert into relationship values(2,1);   

  • insert into relationship values(3,1);   

  • insert into relationship values(5,2);   

  • insert into relationship values(6,2);   

  • insert into relationship values(4,3);   

  • insert into relationship values(7,3);   

  • insert into relationship values(8,3);   

  • insert into relationship values(9,3);   

  • insert into relationship values(10,4);   

  • insert into relationship values(11,4);   

  • insert into relationship values(12,4);   

  • insert into relationship values(13,4);   

  • insert into relationship values(14,5);   

  • insert into relationship values(15,5);  



create table person(id int primary key, description varchar2(50));
create table relationship(child int, parent int, primary key(child,parent));
insert into person values(1,‘省长’);
insert into person values(2,‘市长’);
insert into person values(3,‘县长’);
insert into person values(4,‘镇长’);
insert into person values(5,‘村长’);
insert into person values(6,‘平民’);
...//省略的都是平民
insert into person values(15,‘平民’);
insert into relationship values(1,1); //关系如下
insert into relationship values(2,1);
insert into relationship values(3,1);
insert into relationship values(5,2);
insert into relationship values(6,2);
insert into relationship values(4,3);
insert into relationship values(7,3);
insert into relationship values(8,3);
insert into relationship values(9,3);
insert into relationship values(10,4);
insert into relationship values(11,4);
insert into relationship values(12,4);
insert into relationship values(13,4);
insert into relationship values(14,5);
insert into relationship values(15,5);


查看一下关系树:

Oracle代码 DSC0001.jpg





  • select rpad('---',(level-1)*3,'---')||child relation_tree   
  • from relationship   
  • start with child=parent   
  • connect by nocycle prior child=parent; --结果如下   
  • RELATION_TREE   
  • ------------------   

  • 1  

  • ---2  

  • ------5  

  • ---------14  

  • ---------15  

  • ------6  

  • ---3  

  • ------4  

  • ---------10  

  • ---------11  

  • ---------12  

  • ---------13  

  • ------7  

  • ------8  

  • ------9  
  •   

  • 已选择15行。  



select rpad('---',(level-1)*3,'---')||child relation_tree
from relationship
start with child=parent
connect by nocycle prior child=parent; --结果如下
RELATION_TREE
------------------
1
---2
------5
---------14
---------15
------6
---3
------4
---------10
---------11
---------12
---------13
------7
------8
------9
已选择15行。


查看父子关系情况:

Oracle代码 DSC0002.jpg





  • select child,parent   
  • from relationship   
  • start with child=parent   
  • connect by nocycle prior child=parent   
  • order by parent; --结果如下   
  •  CHILD     PARENT   
  • ---------- ----------   

  •          1          1  

  •          2          1  

  •          3          1  

  •          5          2  

  •          6          2  

  •          4          3  

  •          8          3  

  •          7          3  

  •          9          3  

  •         11          4  

  •         12          4  

  •         10          4  

  •         13          4  

  •         14          5  

  •         15          5  
  •   

  • 已选择15行。  



select child,parent
from relationship
start with child=parent
connect by nocycle prior child=parent
order by parent; --结果如下
CHILD     PARENT
---------- ----------
1          1
2          1
3          1
5          2
6          2
4          3
8          3
7          3
9          3
11          4
12          4
10          4
13          4
14          5
15          5
已选择15行。


下面要看一看:每个人有事时,首先找到谁来处理?不能每个人有事都找省长吧。
下面的sql使用了oracle家的两个变态函数:first_value & connect_by_root

Oracle代码 DSC0003.jpg





  • select distinct child ,first_value(parent)over(partition by child order by lv) parent   
  • from(   
  •     select connect_by_root(r.child) child, p.description descr, level lv, r.parent   
  •     from person p ,relationship r   
  •     where p.id= r.parent   
  •     connect by nocycle prior r.parent=r.child   
  •  )   

  • where descr in('省长''市长''县长')   
  • order by parent,child; --结果如下   
  •      CHILD     PARENT   
  • ---------- ----------   

  •          1          1  

  •          2          1  

  •          3          1  

  •          5          2  

  •          6          2  

  •         14          2  

  •         15          2  

  •          4          3  

  •          7          3  

  •          8          3  

  •          9          3  

  •         10          3  

  •         11          3  

  •         12          3  

  •         13          3  
  •   

  • 已选择15行。  



select distinct child ,first_value(parent)over(partition by child order by lv) parent
from(
select connect_by_root(r.child) child, p.description descr, level lv, r.parent
from person p ,relationship r
where p.id= r.parent
connect by nocycle prior r.parent=r.child
)
where descr in('省长', '市长', '县长')
order by parent,child; --结果如下
CHILD     PARENT
---------- ----------
1          1
2          1
3          1
5          2
6          2
14          2
15          2
4          3
7          3
8          3
9          3
10          3
11          3
12          3
13          3
已选择15行。


这个sql到底行不行,再加条数据看看

Db代码 DSC0004.jpg





  • insert into person values(333,‘县长’);   

  • insert into person values(555,‘村长’);   

  • insert into person values(666,‘平民’);    

  • insert into person values(777,‘平民’);   
  •   

  • insert into relationship values(333,1);   

  • insert into relationship values(555,333);   

  • insert into relationship values(666555);   

  • insert into relationship values(777,666);   

  •               --666这个平民有¥,777愿意跟着他(这条记录比较特殊)  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-257784-1-1.html 上篇帖子: Oracle 大小写区分的处理 中文排序 下篇帖子: 使用Jorm处理Oracle存储过程返回多个游标
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表