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排序

例子:

[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层次查询 树查询 (详细)相关推荐

  1. 查找树的指定层级_非递归层次遍历方法实现二叉树中指定节点的层次数查找

    数据结构教材中,提供了基于队列实现一个二叉树的非递归层次遍历算法.但对于一个任意二叉树,如果要查找其中任何一个节点所在的层次数,教科书中并没有给出基于层次遍历的非递归算法.鉴于层次遍历算法比较容易理解 ...

  2. 查找树的指定层级_阿里面试,问了B+树,这个回答让我通过了

    前言 上周我通过阿里一面,岗位是客户端开发工程师(是的,还是java岗!).面试过程中面试官问了B+树,回答时面试官一直点头(应该回答得还不错所以过了),今天详细讲一讲B+树. 平衡二叉树 它是一棵空 ...

  3. oracle数据库查表_【Oracle数据库】表查询(一)

    Oracle数据库的简单查询 本文使用到的数据表如下图: 表名为 EMP .其中,empno为员工号,empname为员工姓名,job为员工岗位,mgr为该员工上司的员工号,hiredate是入职日期 ...

  4. mysql打平子表_对于oracle进行简单树查询(递归查询)

    DEPTID PAREDEPTID NAME NUMBER NUMBER CHAR (40 Byte) 部门id 父部门id(所属部门id) 部门名称 通过子节点向根节点追朔. Sql代码 selec ...

  5. oracle 多表查询_【Oracle】多表查询

    笛卡尔集 笛卡尔集会在下面条件下产生: 省略连接条件 连接条件无效 所有表中的所有行互相连接 为了避免笛卡尔集, 可以在 WHERE 加入有效的连接条件. Oracle 连接 使用连接在多个表中查询数 ...

  6. oracle树子类遍历父类_不懂数据库索引的底层原理?那是因为你心里没点b树

    前几天下班回到家后正在处理一个白天没解决的bug,厕所突然传来对象的声音: 对象:xx,你有<时间简史>吗? 我:我去!妹子,你这啥癖好啊,我有时间也不会去捡屎啊! 对象:...人家说的是 ...

  7. 浅谈oracle树状结构层级查询

    oracle树状结构查询即层次递归查询,是sql语句经常用到的,在实际开发中组织结构实现及其层次化实现功能也是经常遇到的,虽然我是一个java程序开发者,我一直觉得只要精通数据库那么对于java开发你 ...

  8. b 树查找时间复杂度_心里没点 B 树。。。

    B 树和红黑树的动画小吴还在制作当中,比想象中的复杂好多好多好多,今天先来一个图解版的 B 树... 1 引言 数据库的增删改查等操作是开发过程中最为常见也是尤为重要的,尤其是现在大数据的兴起,导致数 ...

  9. 浅谈oracle树状结构层级查询测试数据

    浅谈oracle树状结构层级查询 oracle树状结构查询即层次递归查询,是sql语句经常用到的,在实际开发中组织结构实现及其层次化实现功能也是经常遇到的,虽然我是一个java程序开发者,我一直觉得只 ...

最新文章

  1. 大受褒扬,BCH中国开发者走向世界!
  2. cve-2016-6662 mysql远程代码执行/权限提升 漏洞
  3. TODO: ping和telnet
  4. 博客园客户端(睡睡版iphone)源码
  5. JavaScript设计一个框架
  6. Windows 上的高效启动器—— Listary
  7. Tomcat下载及配置(IDEA)
  8. rpg模拟器汉化android版,nekorpg模拟器
  9. 同济大学计算机专业考研的教材,同济大学电子信息(计算机与智能技术)专业考研参考书目-指定教材-辅导资料...
  10. 16S扩增子数据提交GSA实操手册—发表文章前必备技能
  11. S2B2C模式有何优势?S2B2C电商系统赋能皮革企业渠道,提升供应链管理效率
  12. 2018国赛数学建模B题两道工序代码
  13. 目标规划的数学建模及求解
  14. Armbian bullseye 系统OMV 6.x安装分享
  15. java email qq邮箱 与 阿里企业邮箱/个人邮箱
  16. 【你好,windows】win7(2019版)旗舰纯净版(usb3.0_nvme)2020.3.14
  17. Java给PNG透明图片加水印,亲测可用
  18. RK3568 VS RK3399
  19. linux 安装snap7,基于linux7的ectd安装与部署
  20. fc安卓模拟器_Win10可以原生使用安卓APP了,模拟器的地位没了!

热门文章

  1. 使用OpenNI2读取oni格式的文件,并将其中的彩色视频,深度视频显示并保存
  2. 简单的实现微信领取红包界面,按钮旋转动画效果。
  3. 快速赚到100万可行方法
  4. 关于微信小程序体验版不开调试部分接口失败原因
  5. Pytorch之模型微调(Finetune)——用Resnet18进行蚂蚁蜜蜂二分类为例
  6. Ubuntu20.4安装CUDA9.0,多版本CUDA切换
  7. 微信营销的经典案例,创新或技术是王道!
  8. 玻璃温室大棚设计及配套系统
  9. 工具篇:gatling
  10. HT32F52352 PWM控制舵机