转自:http://www.2cto.com/database/201209/156398.html
1 定义:
层次查询使用树的遍历,走遍含树形结构的数据集合,来获取树的层次关系报表的方法
树形结构的父子关系,你可以控制:
① 遍历树的方向,是自上而下,还是自下而上
② 确定层次的开始点(root)的位置
层次查询语句正是从这两个方面来确定的,start with确定开始点,connect by确定遍历的方向 www.2cto.com
2 语法:
注释:
① level是伪列,表示等级
② from后面只能是一个表或视图,对于from是视图的,那么这个view不能包含join
③ Where条件限制了查询返回的行,但是不影响层次关系,属于将节点截断,但是这个被截断的节点的下层child不受影响
④ prior是个形容词,可放在任何地方
⑤ 彻底剪枝条件应放在connect by;单点剪掉条件应放在where子句。但是,connect by的优先级要高于where,也就是sql引擎先执行connect by
⑥ 在start with中表达式可以有子查询,但是connect by中不能有子查询
3 遍历树:
㈠ Start with子句
Start with确定将哪行作为root,如果没有start with,则每行都当作root,然后查找其后代,这不是一个真实的查询。Start with后面可以使用子查询或者任何合法的条件表达式
例子:
[sql]
select level,id,manager_id,last_name,title from s_emp
start with title=(select title from s_emp where manager_id is null)
connect by prior id=manager_id;
㈡ Connect by子句
Connect by与prior确定一个层次查询的条件和遍历的方向(prior确定)
Connect by prior column_1=column_2;
其中prior表示前一个节点的意思,可以在connect by等号的前后,列之前,也可以放到select中的列之前 www.2cto.com
Connect by也可以带多个条件,比如 connect by prior id=manager_id and id>10
1. )自顶向下遍历:
先由根节点,然后遍历子节点。column_1表示父key,column_2表示子key。即这种情况下:connect by prior 父key=子key表示自顶向下,等同于connect by 子key=prior 父key.
例子:
[sql]
select level,employee_id,manager_id,last_name,job_id from s_emp
start with manager_id=100
connect by employee_id=prior manager_id;
2. )自底向上遍历:
先由最底层的子节点,遍历一直找到根节点。与上面的相反。Connect by之后不能有子查询,但是可以加其他条件,比如加上and id !=2等。这句话则会截断树枝,如果id=2的这个节点下面有很多子孙后代,则全部截断不显示。
例子:
[sql]
select level,employee_id,manager_id,last_name,job_id from s_emp
start with manager_id=100 www.2cto.com
connect by prior employee_id=manager_id and employee_id<>120;
4 使用level和lpad格式化报表:
Level是层次查询的一个伪列,如果有level,必须有connect by,start with可以没有
Lpad是在一个string的左边添加一定长度的字符,并且满足中间的参数长度要求,不满足自动添加
例子:
[sql]
select level,employee_id,manager_id,lpad(last_name,length(last_name)+(level*4)-4,'_'),job_id from s_emp
start with manager_id=100
connect by prior employee_id=manager_id and employee_id<>120
5 修剪branches:
where子句会将节点删除,但是其后代不会受到影响,connect by 中加上条件会将满足条件的整个树枝包括后代都删除。要注意,如果是connect by之后加条件正好条件选到根,那么结果和没有加一样
6 实际应用
1)查询每个等级上节点的数目
[sql]
先查看总共有几个等级:
select count(distinct level)
from s_emp
start with manager_id is null
connect by prior employee_id=manager_id
要查看每个等级上有多少个节点,只要按等级分组,并统计节点的数目即可,可以这样写:
select level,count(last_name)
from s_emp
start with manager_id is null
connect by prior employee_id=manager_id
group by level www.2cto.com
2)查看等级关系
比如给定一个具体的员工看是否对某个员工有管理权
[sql]
select level,a.* from
s_emp a
where first_name='Douglas' --被管理的节点
start with manager_id is null --开始节点,即:根节点
connect by prior employee_id=manager_id
3)删除子树
比如有这样的需求,现在要裁员,将某个部门的员工包括经理全部裁掉
将id为2的员工管理的所有员工包括自己删除
[sql]
delete from s_emp where employee_id in(
elect employee_id from
s_emp a
start with employee_id=2 --从id=2的员工开始查找其子节点,把整棵树删除
connect by prior employee_id=manager_id)
4)找出每个部门的经理
[sql]
select level,a.* from
s_emp a www.2cto.com
start with manager_id is null
connect by prior employee_id=manager_id and department_id !=prior department_id;--当前行的dept_id不等于前一行的dept_id,即每个子树中选最高等级节点
5)查询一个组织中最高的几个等级
[sql]
select level,a.* from
s_emp a
where level <=2 –查找前两个等级
start with manager_id is null
connect by prior employee_id=manager_id and department_id !=prior department_id;
6)合计层次
有两个需求,一是对一个指定的子树subtree做累加计算salary,一是将每行都作为root节点,然后对属于这个节点的所有子节点累加计算salary。
[sql]
第一种很简单,求下sum就可以了,语句:
select sum(salary) from
s_emp a
start with id=2—比如从id=2开始
connect by prior id=manager_id;
第2个需求,需要用到第1个,对每个root节点求这个树的累加值,然后内部层次查询的开始节点从外层查询获得。
select last_name,salary,(
select sum(salary) from
s_emp www.2cto.com
start with id=a.id –让每个节点都成为root
connect by prior id=manager_id) sumsalary
from s_emp a;
7)找出指定层次中的叶子节点
Leaf(叶子)就是没有子孙的孤立节点。Oracle 10g提供了一个简单的connect_by_isleaf=1,0表示非叶子节点
[sql]
select level,id,manager_id,last_name, title from s_emp
where connect_by_isleaf=1 –表示查询叶子节点
start with manager_id=2
connect by prior id=manager_id;
7 10g新特性:
① 使用SIBLINGS关键字排序
如果使用order by排序会破坏层次,在oracle10g中,增加了siblings关键字的排序
语法:order siblings by <expre>
它会保护层次,并且在每个等级中按expre排序
例子:
[sql]
select level, www.2cto.com
employee_id,last_name,manager_id
from s_emp
start with manager_id is null
connect by prior employee_id=manager_id
order siblings by last_name;
② CONNECT_BY_ROOT
Oracle10g新增connect_by_root,用在列名之前表示此行的根节点的相同列名的值
例子:
[sql]
select connect_by_root last_name root_last_name, connect_by_root employee_id root_id,
employee_id,last_name,manager_id
from s_emp
start with manager_id is null
connect by prior employee_id=manager_id
相关推荐
Oracle 基于树结构查询详解 Oracle 基于树结构查询是一种高效的查询方式,特别在处理树型结构数据时。树结构查询可以快速地检索树型结构数据,并且可以根据实际需求进行查询优化。 树结构查询的基本概念: 树结构...
Oracle树形结构查询,层次查询,hierarchical retrieval Oracle中的树形结构查询,也被称为层次查询或hierarchical retrieval,是一种获取树形结构数据的方法。这种方法可以将数据组织成树形结构,具有层次关系的...
Oracle 查询树形结构 Oracle 查询树形结构是一种特殊的查询方式,它可以将树形结构的数据从 Oracle 数据库中检索出来。这种结构广泛应用于各种应用系统中,例如管理系统、文件系统、组织结构等。 在 Oracle 中,...
总之,Oracle的递归树形结构查询功能是处理层次数据的强大工具,能够有效地支持组织结构、树状分类等业务场景。通过熟练掌握这一特性,开发者可以在数据库层面高效地解决复杂的数据查询问题,减少应用程序的负担。
4. **索引优化**:Oracle支持B树索引、位图索引、函数索引等多种类型,索引的选择和管理对查询性能至关重要。索引维护和选择合适的索引策略是提升数据库性能的关键。 5. **并发控制**:Oracle使用多版本并发控制...
Oracle层次树查询的关键在于`START WITH`和`CONNECT BY`两个子句。`START WITH`定义查询的起始点,可以是任意符合特定条件的节点。而`CONNECT BY`则规定了父节点与子节点之间的连接关系,配合`PRIOR`运算符,可以...
Oracle 数据库在处理树形数据结构时,提供了一种强大的查询方法,即 `SELECT...START WITH...CONNECT BY...PRIOR` 语法。这种查询模式允许我们以递归方式遍历和检索具有层级关系的数据,例如组织结构、产品分类或者...
Oracle树查询是数据库管理中处理层次结构数据的重要技术,它主要依赖于`SELECT...START WITH...CONNECT BY...PRIOR`的语法。这个语法允许我们按照树的结构来组织和检索数据,尤其适用于表示组织结构、目录层级或者...
Oracle树查询是数据库管理中一种非常实用的技术,它允许我们处理具有层级关系的数据。在Oracle中,树查询主要依赖于`SELECT...START WITH...CONNECT BY...PRIOR`语法,这个语法让我们能够按照层级结构遍历数据。本文...
Oracle层次查询功能是Oracle数据库系统中的一个重要特性,它在关系型数据库管理中为处理具有层级关系的数据提供了便利。本文主要探讨了如何利用Oracle的层次查询功能处理和展示类似树形结构的数据。 首先,层次结构...
### Oracle 实战SQL层次查询详解 #### 一、层次查询概念 层次查询,也被称为树型结构查询,是在SQL中最常见的功能之一。这种查询方式主要用于处理具有层级结构的数据,例如组织架构、产品分类等场景。在Oracle...
这里,我们将深入探讨如何使用递归查询来构建菜单树,并特别关注在MySQL和Oracle这两种广泛使用的数据库系统中的实现。 首先,我们要理解什么是递归查询。递归查询是一种在数据库中处理层次数据的方法,它通过自身...
总的来说,实现iBatis下Oracle的树查询需要对iBatis的映射机制、Oracle的层次查询语法以及可能的Java反编译工具有一定了解。这涉及到数据库设计、SQL优化、框架使用等多个方面的知识,是提升数据库操作技能的重要...
总之,Oracle数据库支持对树形结构数据的高效查询,通过`CONNECT BY`和`START WITH`子句,我们可以轻松地构建和遍历这些层次关系,这对于理解和操作复杂的数据结构至关重要。在进行树结构查询时,理解这些语句的工作...
2. **SQL语言**:SQL是查询和操作数据库的标准语言,教程会详细讲解DML(数据操纵语言)如INSERT、UPDATE、DELETE,DDL(数据定义语言)如CREATE、ALTER、DROP,以及查询语言SELECT,包括子查询、连接查询、聚合函数...
在处理复杂的数据查询时,尤其在数据具有层次性或树状结构的情况下,Oracle提供了一种高效的方法——树结构查询。本篇文章将深入探讨Oracle如何处理这类查询,并通过一个具体的文档案例进行解析。 首先,我们要了解...
总结来说,`START WITH...CONNECT BY PRIOR`子句是Oracle SQL处理树形数据的关键工具,通过它可以有效地查询和展示层次关系的数据。理解并熟练运用这个子句,能够帮助你在处理具有层级结构的业务场景时更加游刃有余...
在IT行业中,动态树形菜单是一种常见的用户界面元素,它能以树状结构展示数据,使得用户能够方便地浏览和操作层次化的信息。本项目利用Ajax、JSP和Oracle数据库技术,实现了这样一个功能,让我们来深入探讨一下这些...
本文将详细介绍如何使用这两种方法来实现不同类型的树形结构查询,并通过具体示例加深理解。 #### 1. 基本概念与语法介绍 ##### 1.1 `START WITH`和`CONNECT BY PRIOR` 在Oracle中,要查询树形结构的数据,可以...
Oracle数据库系统在处理层次数据或树形结构时,提供了强大的工具——递归查询。递归查询允许我们在数据表中处理嵌套级别的数据,这在权限查询、组织结构、产品分类等场景中尤其常见。本文将深入探讨Oracle中的树状...