`

Oracle 的递归查询(树型查询)

阅读更多

  工作中经常会遇到将数据库中的数据以树的形式展现的需求。以下我们来看一下该需求在Oracle中如何实现。

首先我们需要有一个树形的表结构(当然有时候会出现表结构不是典型的树形结构,而是多表存储,需要根据多表连接查询生成树)

一、树型表结构:
节点ID  上级ID  节点名称


二、用法: 
select 节点ID,节点名称,level
from 表名
connect 
by prior 节点ID=上级节点ID
start 
with 上级节点ID=节点值

 

说明:
1、常见的树形结构为公司组织机构、地区……
2、求节点ID以上的结构,或以下的结构,将“节点ID=上级节点ID”左右顺序换一下即可。
3、Level为Oracle的特殊字段,表示“层”的意思。当前节点ID的下一层节点为“1”。

 

测试SQL: 1,建立表结构

create table Dept(
DepartNO  
varchar2(10),
DepartName  
varchar2(20),
TopNo    
varchar2(10)
);

 插入数据: 

insert into Dept values('001',' 董事会','0');
commit;
insert into Dept values('002','总裁办 ','001');
commit;
insert into Dept values('003','财务部 ','001');
commit;
insert into Dept values('004','市场部 ','002');
commit;
insert into Dept values('005','公关部 ','002');
commit;
insert into Dept values('006','销售部 ','002');
commit;
insert into Dept values('007','分销处 ','006');
commit;
insert into Dept values('008','业务拓展处','004');
commit;
insert into Dept values('009','销售科','007');
commit;
复制代码

 

 1,向前查 (从查询本身一直到最上面的机构)

比如:
select distinct departno,departname,level
from dept
connect 
by prior topno=departno
start 
with
departno
='005';

  2,向后查:(从查询本身一直到最下面的机构)

 

select distinct departno,departname,level
from dept
connect 
by prior departno=topno
start 
with
topno
='001';

上面语句中用PRIOR表示上一条记录,比如 CONNECT BY PRIOR ID=PRAENTID就是说上一条记录的ID(比如根记录)是(下一条)本条记录的PRAENTID,即本记录的父亲是上一条记录。

 

多表查询例子:

 

    select a.ar_file_name,a.ar_depart_id,b.depart_no,b.depart_name

 from t_archives a left join csr_department b on(a.ar_depart_id = b.depart_no)
 where a.ar_depart_id in(
 	select a.depart_no
           from csr_department a 
          start with a.depart_no in ('8637')
         connect by prior a.depart_id = a.parent_id
 )
1
2
分享到:
评论
1 楼 haiw 2016-03-01  
谢谢分享

相关推荐

    Oracle递归树形结构查询功能

    Oracle数据库在处理树形结构数据时提供了强大的递归查询功能,这种特性对于组织结构、产品分类、层级菜单等场景的应用非常广泛。递归树形结构查询主要依赖于`CONNECT BY`和`PRIOR`关键字,它们允许我们构建复杂的...

    ORACLE查询树型关系(connect_by_prior_start_with)

    ORACLE 查询树型关系(connect_by_prior_start_with) Oracle 查询树型关系是指使用 START WITH 和 CONNECT BY 子句来实现 SQL 的层次查询。从 Oracle 9i 开始,可以通过 SYS_CONNECT_BY_PATH 函数实现将父节点到...

    oracle 树型的寻父或寻子

    另外,为了优化树型查询,可以考虑创建索引。特别是对PARENT_EMP_ID这样的关联字段,建立索引可以显著提升查询速度。同时,如果树的深度很大,还可以考虑使用 Materialized View 来预计算和存储部分结果,进一步提升...

    一种MySQL数据库SQL递归查询的研究与实现.pdf

    虽然MySQL在处理常规数据操作和查询方面表现出色,但在某些特定功能上,如递归查询,与Oracle和SQL Server等商业数据库相比,存在一定的局限性。在MySQL中,没有内置的递归查询语句,通常需要借助存储过程或存储函数...

    基于Oracle的层次树查询功能及实例分析.pdf

    层次树查询在Oracle数据库中实质上是一种递归查询,它能够有效地解析层次结构数据。以某公司的部门组织结构为例,这些数据存储在Oracle数据库LSYX的BMXX表中,包括部门编码、部门名称、上级部门编码和上级部门名称四...

    MS SQL Server树形结构表遍历的循环算法.pdf

    例如,在Oracle中,可以利用CONNECT BY子句实现树结构的递归查询,而在IBM DB2中,递归查询的SQL语句由初始查询、递归查询和最终查询三部分组成。但是,MS SQL Server在当时尚未内置递归查询功能,这意味着在MS SQL ...

    JSP与无限级分类树型菜单

    例如,可以使用递归查询或者自连接来获取无限级别的分类树。 3. 数据处理:在JSP中,我们可以使用Java代码块()来处理获取到的数据。这里需要构建一个树形结构,通常用Map或者自定义的树节点类来存储。每个节点...

    ADO方式填充树型框.rar

    总之,"ADO方式填充树型框"涉及了ADO对象模型的使用、数据库连接的建立与管理、SQL查询的执行以及数据的层次化呈现。通过这个过程,开发者可以将数据库中的复杂层级数据以直观的方式展示给用户,提高用户体验。

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

    一种常见的方法是使用递归查询,通过自身连接多次来查找所有子节点。例如,可以使用`WITH RECURSIVE`语句(在支持的SQL版本中,如PostgreSQL、SQL Server 2005及以上)或者使用自连接和JOIN操作(在不支持递归的SQL...

    C#动态生成树型结构的Web程序设计.doc

    递归方法通常涉及调用自身函数,将当前节点作为父节点,查询其子节点并添加。循环嵌套则是在已有的节点上,再次执行查询和添加操作。 4. **优化与扩展** - **性能优化**:大量数据时,可考虑分页加载或懒加载策略...

    数据库填充到树型框例程.e.rar

    4. **数据转换**:查询结果通常是以二维表格的形式返回,而树型框需要的是层次结构。因此,可能需要将数据转换为树形结构,这可能涉及到递归函数或数据结构(如链表、树)的使用。 5. **树型控件**:在UI层面上,...

    将数据库中的内容加入树型控件中,通过建立数据库,再与树型控件

    这通常通过SQL(结构化查询语言)来完成,可以是关系型数据库如MySQL、SQL Server或Oracle,也可以是非关系型数据库如MongoDB或Redis。数据库的设计应考虑实际需求,包括表的结构、字段定义以及数据之间的关系。例如...

    oracle prior

    Oracle Prior 知识点总结 Oracle 中的 Prior 子句是...Oracle 的 Prior 子句提供了一种灵活的方式来查询树状结构表中的数据,可以根据需要指定查询的顺序和范围,并且可以使用 WHERE 子句来限定树型结构中的单个节点。

    MySQL实现树状所有子节点查询的方法

    在MySQL中,实现树状所有子节点的查询并非像Oracle那样可以直接使用Hierarchical Queries和`CONNECT BY`语句。然而,尽管MySQL不直接支持这样的功能,我们仍然可以通过其他方法来达到相同的效果。以下将详细介绍几种...

    用SQL形成父子结点树结构的妙法.pdf

    这就需要开发人员利用编程手段来解析树型结构数据并展示为树状视图,这通常是通过递归查询或是使用特殊的GUI控件来实现的。 然而,本文提出了一种不需要特别程序解析,几乎可以使用列表型字典表的处理逻辑,通过一...

    Excel树形结构数据导入Oracle数据库(Java)

    2. **数据解析**:对于树形结构数据,需要逐级解析,可能涉及到递归方法,将每一层的数据转换成Java对象。这些对象可能包含父节点、子节点以及相关属性。 3. **数据映射**:将Excel中的列名与Oracle数据库表的字段...

    FOLDERTEST

    这个表单包含了实现文件夹功能的各种组件和逻辑,如按钮、列表框、树型控件等,以及相应的触发器和过程,用于处理用户的交互和数据操作。通过分析这个表单,我们可以学习到如何动态加载和显示文件夹结构,如何实现...

    通向架构师的道路(第六天)之漫谈基于数据库的权限系统的设计

    这样,通过Oracle的START WITH...CONNECT BY语句,可以方便地查询出整个菜单树,而无需递归。例如,以下SQL语句可以获取所有一级菜单及其子菜单: ```sql SELECT * FROM T_SYS_MENU START WITH MENU_PID = 0 ...

    计算机二级常考的知识点.pdf

    - **关系数据库管理系统(RDBMS)**:如MySQL、Oracle、SQL Server等。 - **SQL语言**:用于查询、插入、更新和删除数据。 4. **计算机网络**: - **基本概念**:计算机网络是由多个通过通信设施互连的计算机组成...

    JAVA上百实例源码以及开源项目源代码

    递归遍历矩阵 1个目标文件,简单! 多人聊天室 3个目标文件 第一步:运行ServerData.java 启动服务器,然后服务器处于等待状态 第二步:运行LoginData.java 启动(客户端)登陆界面 输入用户名 ip为本机localhost 第...

Global site tag (gtag.js) - Google Analytics