`
taiwei.peng
  • 浏览: 232645 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

oracle 递归查询一个树形结构的菜单

 
阅读更多
关键字: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代码
  1. create table person(id int primary key, description varchar2(50));   
  2. create table relationship(child int, parent int, primary key(child,parent));   
  3. insert into person values(1,‘省长’);   
  4. insert into person values(2,‘市长’);   
  5. insert into person values(3,‘县长’);   
  6. insert into person values(4,‘镇长’);   
  7. insert into person values(5,‘村长’);   
  8. insert into person values(6,‘平民’);   
  9. ...//省略的都是平民   
  10. insert into person values(15,‘平民’);   
  11.   
  12. insert into relationship values(1,1); //关系如下   
  13. insert into relationship values(2,1);   
  14. insert into relationship values(3,1);   
  15. insert into relationship values(5,2);   
  16. insert into relationship values(6,2);   
  17. insert into relationship values(4,3);   
  18. insert into relationship values(7,3);   
  19. insert into relationship values(8,3);   
  20. insert into relationship values(9,3);   
  21. insert into relationship values(10,4);   
  22. insert into relationship values(11,4);   
  23. insert into relationship values(12,4);   
  24. insert into relationship values(13,4);   
  25. insert into relationship values(14,5);   
  26. 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代码
  1. select rpad('---',(level-1)*3,'---')||child relation_tree   
  2. from relationship   
  3. start with child=parent   
  4. connect by nocycle prior child=parent; --结果如下   
  5. RELATION_TREE   
  6. ------------------   
  7. 1  
  8. ---2  
  9. ------5  
  10. ---------14  
  11. ---------15  
  12. ------6  
  13. ---3  
  14. ------4  
  15. ---------10  
  16. ---------11  
  17. ---------12  
  18. ---------13  
  19. ------7  
  20. ------8  
  21. ------9  
  22.   
  23. 已选择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代码
  1. select child,parent   
  2. from relationship   
  3. start with child=parent   
  4. connect by nocycle prior child=parent   
  5. order by parent; --结果如下   
  6.  CHILD     PARENT   
  7. ---------- ----------   
  8.          1          1  
  9.          2          1  
  10.          3          1  
  11.          5          2  
  12.          6          2  
  13.          4          3  
  14.          8          3  
  15.          7          3  
  16.          9          3  
  17.         11          4  
  18.         12          4  
  19.         10          4  
  20.         13          4  
  21.         14          5  
  22.         15          5  
  23.   
  24. 已选择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代码
  1. select distinct child ,first_value(parent)over(partition by child order by lv) parent   
  2. from(   
  3.     select connect_by_root(r.child) child, p.description descr, level lv, r.parent   
  4.     from person p ,relationship r   
  5.     where p.id= r.parent   
  6.     connect by nocycle prior r.parent=r.child   
  7.  )   
  8. where descr in('省长''市长''县长')   
  9. order by parent,child; --结果如下   
  10.      CHILD     PARENT   
  11. ---------- ----------   
  12.          1          1  
  13.          2          1  
  14.          3          1  
  15.          5          2  
  16.          6          2  
  17.         14          2  
  18.         15          2  
  19.          4          3  
  20.          7          3  
  21.          8          3  
  22.          9          3  
  23.         10          3  
  24.         11          3  
  25.         12          3  
  26.         13          3  
  27.   
  28. 已选择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代码
  1. insert into person values(333,‘县长’);   
  2. insert into person values(555,‘村长’);   
  3. insert into person values(666,‘平民’);    
  4. insert into person values(777,‘平民’);   
  5.   
  6. insert into relationship values(333,1);   
  7. insert into relationship values(555,333);   
  8. insert into relationship values(666555);   
  9. insert into relationship values(777,666);   
  10.               --666这个平民有¥,777愿意跟着他(这条记录比较特殊)  
分享到:
评论

相关推荐

    Oracle递归树形结构查询功能

    总之,Oracle的递归树形结构查询功能是处理层次数据的强大工具,能够有效地支持组织结构、树状分类等业务场景。通过熟练掌握这一特性,开发者可以在数据库层面高效地解决复杂的数据查询问题,减少应用程序的负担。

    递归查询菜单树,支持mysql,oracle

    在构建应用程序时,特别是涉及到用户界面的交互,如菜单系统,我们经常需要将数据组织成层次结构,例如树形结构。这里,我们将深入探讨如何使用递归查询来构建菜单树,并特别关注在MySQL和Oracle这两种广泛使用的...

    oracle菜单树查询

    oracle菜单树查询 使用实例 使用START WITH CONNECT BY PRIOR子句实现递归查询

    dhtmlx tree 使用,与oracle递归查询的结合

    这个文件可能包含了用于从Oracle数据库中获取树形结构数据的SQL查询语句,其中可能使用了`CONNECT BY`或`START WITH`等关键字来实现递归。分析这个文件的内容可以帮助我们了解如何构建适合dhtmlx Tree的递归查询。 ...

    Oracle递归查询

    为了更好地理解Oracle中的递归查询,我们首先需要创建一张表格来存储一个简单的树形结构。下面是一张名为`TEST_TREE`的表,包含以下列: - `ID`: 主键,标识每个节点。 - `PID`: 父节点ID,表示当前节点的上一级...

    oracle树形结构,结合dtree插件使用显示树状结构菜单

    通过以上步骤,我们可以实现一个完整的树形结构菜单系统,让用户在前端直观地浏览和操作Oracle数据库中的层级数据。不过,具体实现细节会因dtree插件版本和具体业务需求而有所不同,因此在实际操作中需要查阅相关...

    Ajax+jsp+oracle实现动态树形菜单

    总结来说,"Ajax+jsp+oracle实现动态树形菜单"项目是一个典型的前后端交互示例,它结合了客户端的Ajax技术、服务器端的JSP处理以及数据库操作,展示了如何高效地处理和展示层次结构的数据。通过理解这些技术的原理和...

    Java与Oracle实现的树形菜单

    5. **TreeView组件**:在前端,"treeview"可能是指一个用于展示树形结构的用户界面组件。这可能是一个JavaScript库,如jQuery UI的TreeView,或者是基于现代前端框架如React或Vue的组件。TreeView接收从服务器端发送...

    无限级树形菜单(Sql数据库)

    为了展示无限级树形菜单,我们可以使用编程语言(如Java、C#、Python等)与数据库交互,将查询结果转换成树形结构。这通常涉及递归函数,遍历查询结果并构建树节点。每个节点包含其自身的属性(如名称、URL等),...

    数据库控制树形结构的生成

    3. **遍历与构建**:为了生成实际的树形结构,可以使用递归查询或者层次遍历方法。递归查询从根节点开始,逐层扩展到子节点;层次遍历则可以使用栈或队列等数据结构,按照深度优先或广度优先的顺序遍历所有节点。 4...

    springboot + vue 实现递归生成多级菜单(实例代码)

    递归算法可以将菜单数据结构转换为树形结构,从而生成多级菜单。在本文中,我们将使用 SpringBoot 框架和 Vue.js 框架来实现递归生成多级菜单。 知识点四:数据库设计 在实现递归生成多级菜单时,需要设计一个合适...

    无限级树形菜单(Sql数据库).zip

    在前端展现方面,JavaScript库如jQuery、React、Vue等都有成熟的组件可以方便地渲染树形结构。常见的有`TreeView`组件,它们通常支持异步加载、节点展开/折叠、拖拽排序等功能。同时,前端需要与后端接口配合,通过...

    树形菜单(Java)

    例如,我们可能有一个`departments`表,包含`id`、`name`和`parent_id`字段,可以写一个DAO层的方法来获取树形结构: ```java public List&lt;TreeNode&gt; getTreeNodes() { // SQL查询 // ... // 转换查询结果为...

    oracle树结构查询.DOC

    这两个子句是Oracle特有的,用于处理层级关系的数据,例如组织结构、产品分类或者树形菜单等。理解并掌握这两种子句的用法对于处理层级数据至关重要。 `START WITH`子句用于指定查询的起始节点,也就是树结构中的根...

    jsp实现树形目录,菜单,算法

    - **动态生成树形菜单**:为了让树形菜单具备动态加载的功能,通常需要后端提供一个接口来获取树形数据,然后前端根据接收到的数据动态生成对应的菜单项。 - 这种方法的好处在于可以显著减少页面的初始加载时间,...

    java动态生成菜单

    `dtree`插件则是一个用于前端展示的树形结构组件,它可以优雅地展示这些动态生成的菜单。 首先,我们需要理解Java如何从数据库获取菜单数据。通常,菜单数据存储在关系型数据库如MySQL、Oracle或PostgreSQL中的表中...

    SQL语句-递归查询、分组、统计.pdf

    - 递归查询主要用于处理层级数据,例如组织结构、树形菜单等。在Oracle数据库中,我们可以使用`CONNECT BY`子句实现递归查询。 - 1.2.1 递归查询:通过`CONNECT BY`和`PRIOR`关键字,从指定的根节点(`t.orgid = ...

    java编程两种树形菜单结构的转换代码

    完成转换后,通常会提供一个方法来展示转换后的树形结构,例如通过递归打印或渲染成HTML。这样的方法可以帮助开发者检查和调试转换结果,也可以用于用户界面的展示。 总之,Java中的树形菜单结构转换是一个常见的...

Global site tag (gtag.js) - Google Analytics