Oracle 层级查询(Hierarchical Queries)

如果一张表中的数据存在分级(即数据间存在父子关系),利用普通SQL语句显示数据间的层级关系非常复杂,可能需要多次连接才能完整的展示出完成的层级关系,更困难的是你可能不知道数据到底有多少层。而利用Oracle的层级查询,则可以很方便的显示出层级。

一、语法简介

层级关系定义语法如由start withconnect by两个子句构成:

start withconnect by [nocycle] [prior] …
或
connect by [nocycle] [prior]start with
  • start with …,定义根节点,即层级关系的起点
  • connect by …,定义层级关系,即上下级的连接条件
  • prior,层级关系中指定父级列
  • nocycle,当层级关系出现循环时依然输出结果,和connect_by_iscycle配合使用

相关伪列/函数/排序:

  • level,显示当前记录所在的层级,根节点的层级为1,下级为2,依次类推
  • sys_connect_by_path,显示指定列的完整层级关系,可以自定义连接符
  • connect_by_isleaf,判断当前记录是否叶子节点(没有子孙节点)
  • connect_by_iscycle,和nocycle配合使用,判断层级关系是否存在循环
  • connect_by_root …,显示当前记录的根节点相关信息
  • order siblings by …,按照层级依次排序,即先按层级1排序,再按层级2排序,依次类推

二、应用示例

我们以Oracle Sample Schema中的hr.employees表来演示。这张雇员表中的记录通过2个字段定义上下级关系,employee_id为雇员编号,manager_id为上级的雇员编号,例如King的employee_id为100,他的manager_id是空(没有上级),Kochhar的manager_id是100,代表他的上级是King:

select last_name, employee_id, manager_id from employees;

在这里插入图片描述

2.1 基本层级查询

下面的SQL查询每位雇员的层级,同时用通过伪列evel显示出来:

select last_name, employee_id, manager_id,level
from employees
start with employee_id=100 connect by manager_id=prior employee_id;

在这里插入图片描述

  • start with employee_id=100,定义根节点,这里代表从King开始计算层级
  • level 伪列显示当前记录的层级,根节点King的Level为1,Kochhar为King的下级,level为2
  • connect by 定义层级关系,这里是通过manager_id和employee_id的关系判断层级
  • prior 指示层级关系中谁是父级列,虽然我们从列名的含义可以判断出manager_id对应上级记录的employee_id,但是Oracle并不知道,我们需要用prior关键字指示,即manager_id(本级记录)=prior employee_id(上级记录);

上面的示例,如果倒过来查层级关系,将employee_id为110的雇员(层级为4)作为根节点,那么prior关键字也需要换位置:

select last_name, employee_id, manager_id,level
from employees
start with employee_id=110 connect by  prior manager_id=employee_id;

在这里插入图片描述

2.2 显示完整层级关系

通过函数sys_connect_by_path可以显示完整的层级路径,该函数有2个参数,列和连接符号。示例中还使用了ltrim函数去除了最左边的连接符:

select last_name, employee_id, manager_id, level, 
ltrim(sys_connect_by_path(last_name, ' => '),' => ') Hierarchy
from employees
start with employee_id=101 connect by manager_id=prior employee_id; 

在这里插入图片描述

2.3 显示是否存在循环

Kochhar对应的上级employee_id为100,如果修改成206,那么层级关系就出现了循环(子孙节点同时也是自己的祖先节点),当出现循环时,普通的层级查询会出现下列报错:
在这里插入图片描述
这时可以使用nocycle关键字,指示即使出现循环依然返回结果,并通过connect_by_iscycle伪列显示哪些记录出现了循环:

select last_name, employee_id, manager_id, level, ltrim(sys_connect_by_path(last_name, ' => '),' => ') Hierarchy, 
connect_by_iscycle 是否循环
from employees
start with employee_id=101 connect by nocycle manager_id=prior employee_id;

在这里插入图片描述

2.4 判断是否为叶子节点

connect_by_isleaf伪列可以显示当前记录是否为叶子节点,如果是叶子节点则返回1,否则返回0。例如用where connect_by_isleaf=1可以过滤出所有的叶子节点:

select last_name, employee_id, manager_id, level, connect_by_isleaf
from employees
-- where connect_by_isleaf =1
start with employee_id=101 connect by manager_id=prior employee_id; 

在这里插入图片描述

2.5 显示层级的根节点

connect_by_root后面跟上列名,可以显示该列层级的根节点:

select last_name, employee_id, manager_id, level, 
ltrim(sys_connect_by_path(last_name, ' => '),' => ') Hierarchy,
connect_by_root last_name Leader
from employees
where level>1 
connect by manager_id=prior employee_id; 

在这里插入图片描述

2.6 按层级排序

在层级查询中,如果要按照层级关系排序,普通的order by语句是无法做到的,此时需要使用order siblings by语句,该语句会按照层级依次对结果进行排序(先按层级1排序,再按层级2排序…):

select last_name, employee_id, manager_id, level, ltrim(sys_connect_by_path(last_name, ' => '),' => ') Hierarchy
from employees
start with employee_id=100 connect by manager_id=prior employee_id
order siblings by last_name;

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/738170.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VSCode单机活动栏图标无法收起

如果活动栏为展开状态,单击活动栏图标可以正常收起,但无法通过再次单击打开,解决方案如下: 设置->工作台->外观: Activity Bar:Icon Click Behavior: 切换为默认的toggle

案例分析篇03:一篇文章搞定软考设计模式考点(2024年软考高级系统架构设计师冲刺知识点总结系列文章)

专栏系列文章推荐: 2024高级系统架构设计师备考资料(高频考点&真题&经验)https://blog.csdn.net/seeker1994/category_12601310.html 【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】(2024年软考高级系统架构设计师冲刺知识点总结-案例分析篇-…

垃圾收集器

垃圾收集器 文章目录 垃圾收集器垃圾收集算法分代收集理论标记复制算法(eden区域算法)标记清除算法(老年代算法)标记整理算法垃圾收集器种类垃圾收集器之Serial(-XX:useSerialGC -XX: useSerialOldGC)垃圾收集器之Parallel Scavenge(-XX:useParallelGC -…

51单片机基础篇系列-点亮一个LED发光管基础知识搭建

🌈个人主页: 会编辑的果子君 💫个人格言:“成为自己未来的主人~” LED发光二极管 它是半导体二极管的一种,可以把电能转化成光能,常简写为LED,发光二极管与普通二极管一样是由一个PN结组成,也具有单向…

Android中单例模式正确实现方式

1. 饿汉模式 -线程安全 在类加载时进行实例化, 线程安全,但会导致类加载时间变长。饿汉模式如果使用过多,可能会对App启动耗时带来不利影响。 2. 懒汉模式 -线程不安全 没有加锁, 因此线程不安全。 3. 两次判空 加同步锁 -线程不…

基于PHP构建的HTML5点餐系统的设计13.91

随着互联网时代的发展,人们的生活方式正在发生改变。传统的餐饮行业也正在发生变革。人们不再满足过去的点餐方式,需要更好的体验。本课题旨在结合点餐系统的技术优势,设计一个能够方便顾客与商家,并且节约人力成本以及可以很好地…

HTML5:七天学会基础动画网页11

CSS3动画 CSS3过渡的基本用法: CSS3过渡是元素从一种样式逐渐改变为另一种样式的效果。 过渡属性-transition 值与说明 transition-property 必需,指定CSS属性的name,transition效果即哪个属性发生过渡。 transition-duration 必需,t…

深入浅出计算机网络 day.2 概论⑥ 计算机网络体系结构

上帝疯狂杜撰世界悲情的命题 将凉薄和荒芜尽写 —— 24.3.12 内容概述 1.常见的三种计算机网络体系结构 2.计算机网路体系结构分层的必要性 3.计算机网络体系结构分层思想举例 4.计算机网络体系结构中的专用术语 一、常见的三种计算机网络体系结构 OSI参考模型 TCP/IP参…

深入理解Java中的线程安全List:CopyOnWriteArrayList原理和应用

码到三十五 : 个人主页 心中有诗画,指尖舞代码,目光览世界,步履越千山,人间尽值得 ! 在Java并发编程中,线程安全的数据结构是至关重要的。其中,CopyOnWriteArrayList是一个线程安全的ArrayLis…

HBase非关系型数据库

HBase非关系型数据库 1 什么是HBase2 HBase的特点3 什么时候需要HBase4 HBase的数据模型5 HBase架构5.1 架构5.2 HBase如何列式储存 6 如何正确设计RowKey 1 什么是HBase HBase – Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩、 实时读写的分布式数据…

第100+1步 ChatGPT文献复现:ARIMAX预测肺结核 vol. 1

基于WIN10的64位系统演示 一、写在前面 各位大佬,好久不见。 《100步入门机器学习》肝完了,不懂大家学了多少了,默认你们都学完了吧。 今年我们换一个玩法(灌水):一系列更接近实战的教程,复…

(黑马出品_07)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式

(黑马出品_07)SpringCloudRabbitMQDockerRedis搜索分布式 微服务技术分布式搜索 今日目标1.数据聚合1.1.聚合的种类1.2.DSL实现聚合1.2.1.Bucket聚合语法1.2.2.聚合结果排序1.2.3.限定聚合范围1.2.4.Metric聚合语法1.2.5.小…

6.S081的Lab学习——Lab1: Xv6 and Unix utilities

文章目录 前言一、启动xv6(难度:Easy)解析: 二、sleep(难度:Easy)解析: 三、pingpong(难度:Easy)解析: 四、Primes(素数,难度:Moderate/Hard)解析&#xff1a…

node.js入门

一、cmd常用命令 windowsR 再输入cmd 打开命令提示符 (1)切换盘符 c: / d: (2)dir 查看全部内容 (3)cd 你需要打开的文件所处的大文件夹名字 (4)cd 大文件夹名再输入dir 查看该大文件里面的所有内容 (5)输出结果里 一个.表示当前目录,两个..表示上级目录 …

怎样在CSDN赚点零花钱

请教一下各位大佬,看到你们在CSDN很多都几万粉丝以上,能不能分享一下有什么涨粉的经验,还有怎样转化为额外收益……感谢各位提供宝贵的经验,谢谢……

文献阅读笔记:全卷积神经网络

文献阅读笔记:全卷积神经网络 摘要Abstract1. 全卷积神经网络1.1 文献摘要1.2 全卷积神经网络1.2.1 网络结构1.2.0 从分类器到密集 FCN1.2.2 上采样 Upsampling1.2.3 跳级结构1.2.4 FCN训练 1.3 实验1.4 总结 2. 代码实现 摘要 本周学习了全卷积神经网络&#xff0…

Acer宏碁非凡Swift SFG16-71工厂模式原厂Win11系统,预装OEM系统恢复开箱状态

宏基笔记本电脑SFG16-71原装出厂Windows11系统安装工厂包下载,带恢复重置功能 链接:https://pan.baidu.com/s/1JK02kBbwKG_cIBNlEOzrOw?pwdzdfm 提取码:zdfm 原装工厂包系统自带所有驱动、Office办公软件、出厂时自带主题壁纸图片、系统…

如何免费获取基于公网 IP 的 SSL 证书 (无需域名)

现在给网站安装SSL证书来实现网站的HTTPS安全访问已经成了大多数人的共识,但是有一些特殊情况:比如对于个别的应用IP地址不需要绑定域名,只是单纯用IP来访问网站,这种情况下,可以实现HTTPS访问吗? 先说答案…

vue-创建vue项目记录

安装node.js 先安装node.js的运行环境node.js的下载地址 安装后就可以使用npm命令 1、清除npm缓存:npm cache clean --force 2、禁用SSL:npm config set strict-ssl false 3、手动设置npm镜像源:npm config set registry https://registry.…

揭密无文件勒索病毒攻击,思考网络安全新威胁

前言 最近几年基于无文件攻击的网络犯罪活动越来越多,一些网络犯罪团伙开发了各种基于无文件攻击的恶意软件攻击套件,这些恶意软件攻击套件可用于勒索病毒、挖矿病毒、RAT远控、僵尸网络等恶意软件,在过去的几年时间里,无文件感染…