当前位置: 首页 > news >正文

【Oracle】Oracle语法之递归查询

目录

  • 递归查询
  • 使用场景
    • 备注
  • 语法
    • 相关属性解释
  • 案例
    • 基本使用
    • 升级版-带上递归查询的属性
  • 总结:

递归查询

  • Oracle的递归查询是指在一个查询语句中使用自引用的方式进行循环迭代查询。
  • 它可以用于处理具有层次结构的数据,如组织架构、产品类别等。
  • 递归查询通常使用WITH子句来定义递归查询的起始条件和终止条件,并使用UNION ALL运算符来连接递归查询的结果。

使用场景

递归查询在以下场景中经常被使用:

  1. 组织架构查询:递归查询可以用于查找组织架构的层次结构,例如查询某个员工的上级、下属或者所有下属。

  2. 产品类别查询:递归查询可以用于查询产品类别的层次结构,例如查询某个类别的所有子类别或者找到某个产品所属的所有类别。

  3. 树状结构查询:递归查询可以用于查询树状结构的层次关系,例如查询文件系统的目录结构、查询城市的层级关系等。

  4. 图结构查询:递归查询可以用于查询图结构的相关信息,例如查询社交网络中某个人的朋友列表、查询电影的相关推荐等。

  5. 日期范围查询:递归查询可以用于查询一个连续的日期范围内的数据,例如查询某个日期范围内的销售数据或者某个日期范围内的日志信息。

备注

  • 需要注意的是,在使用递归查询时要注意性能问题,特别是当数据量较大时。
  • 为了避免性能问题,可以使用递归查询的剪枝功能、添加适当的索引或者使用其他优化技巧来提升查询效率。
  • 此外,对于复杂的递归查询,可能需要考虑使用存储过程或者递归SQL重写来优化查询性能。

语法

SELECT * FROM TABLE WHERE 条件3 START WITH 条件1 CONNECT BY 条件2;

相关属性解释

  • start with [condition]: 设置起点,用来限制第一层的数据,或者叫根节点数据;以这部分数据为基础来查找第二层数据,然后以第二层数据查找第三层数据以此类推。省略后默认以全部行为起点。

  • connect by [condition] : 用来指明在查找数据时以怎样的一种关系去查找;比如说查找第二层的数据时用第一层数据某个字段进行匹配,如果这个条件成立那么查找出来的数据就是第二层数据,同理往下递归匹配。

  • prior : 表示上一层级的标识符。经常用来对下一层级的数据进行限制。不可以接伪列。prior在等号前面和后面,查询的数据是不一样的

  • level : 伪列(关键字),代表树形结构中的层级编号(数字序列结果集),这个必须配合connect by使用,和rownum是同等效果。

  • connect_by_root : 显示根节点列。经常用来分组。

  • connect_by_isleaf : 1是叶子节点,0不是叶子节点。在制作树状表格时必用关键字。

  • sys_connect_by_path() : 将递归过程中的列进行拼接。

  • nocycle、connect_by_iscycle: 在有循环结构的查询中使用。

  • siblings : 保留树状结构,对兄弟节点进行排序。

案例

基本使用

假设我们要创建一个员工表,包含员工ID、姓名和上级ID字段。我们可以按照以下方式创建表结构并插入一些数据:

CREATE TABLE employees (employee_id NUMBER,name VARCHAR2(50),manager_id NUMBER
);INSERT INTO employees VALUES (1, 'Alice', NULL);
INSERT INTO employees VALUES (2, 'Bob', 1);
INSERT INTO employees VALUES (3, 'Charlie', 2);
INSERT INTO employees VALUES (4, 'Dave', 2);
INSERT INTO employees VALUES (5, 'Eve', 1);

现在我们可以编写两个递归查询,一个向上查找某个员工的所有上级,一个向下查找某个员工的所有下级。

向上递归查询可以使用CONNECT BY PRIOR关键字:

-- 向上递归查询
SELECT employee_id, name
FROM employees
START WITH name = 'Charlie' -- 起始条件
CONNECT BY PRIOR manager_id = employee_id -- 递归条件
ORDER BY level DESC;

结果将返回:

EMPLOYEE_ID | NAME
-----------------
1            Alice
2            Bob
3            Charlie

向下递归查询可以使用CONNECT BY关键字:

-- 向下递归查询
SELECT employee_id, name
FROM employees
START WITH name = 'Alice' -- 起始条件
CONNECT BY PRIOR employee_id = manager_id -- 递归条件
ORDER BY level;

结果将返回:

EMPLOYEE_ID | NAME
-----------------
1            Alice
2            Bob
3            Charlie
4            Dave
5            Eve

这样,我们就可以通过递归查询在员工表中向上或向下查找员工的上级或下级关系。

升级版-带上递归查询的属性

假设我们要创建一个部门表,包含部门ID、部门名称和上级部门ID字段。我们可以按照以下方式创建表结构并插入一些数据:

CREATE TABLE departments (department_id NUMBER,department_name VARCHAR2(50),parent_department_id NUMBER
);INSERT INTO departments VALUES (1, 'Sales', NULL);
INSERT INTO departments VALUES (2, 'Marketing', 1);
INSERT INTO departments VALUES (3, 'Finance', 1);
INSERT INTO departments VALUES (4, 'Operations', NULL);
INSERT INTO departments VALUES (5, 'Advertising', 2);

现在我们可以编写一个递归查询,查找某个部门的所有下级部门,并包含递归查询的属性。

-- 递归查询部门及其下级部门
SELECT CONNECT_BY_ROOT department_id AS root_department_id,d.department_id,d.department_name,d.parent_department_id,LEVEL
FROM departments d
START WITH department_id = 1 -- 起始条件
CONNECT BY PRIOR department_id = parent_department_id -- 递归条件
ORDER BY root_department_id, LEVEL;

结果将返回:

ROOT_DEPARTMENT_ID | DEPARTMENT_ID | DEPARTMENT_NAME | PARENT_DEPARTMENT_ID | LEVEL
-----------------------------------------------------------------------------------
1                   1               Sales             null                   1
1                   2               Marketing         1                      2
1                   5               Advertising       2                      3
1                   3               Finance           1                      2
4                   4               Operations        null                   1

在查询结果中,ROOT_DEPARTMENT_ID代表根部门的ID,DEPARTMENT_ID代表当前部门的ID,DEPARTMENT_NAME代表当前部门的名称,PARENT_DEPARTMENT_ID代表当前部门的上级部门ID,LEVEL代表当前部门在层级结构中的级别。

这样,我们可以通过递归查询在部门表中查找某个部门的所有下级部门,并获得相关属性的信息。

总结:

  • Oracle的递归查询是一种强大的功能,可以用于处理具有层次结构的数据(如组织架构、树形结构等)。
  • 递归查询基于CONNECT BY和PRIOR关键字,可以在SQL语句中实现递归的操作。

在使用Oracle的递归查询时,需要注意以下几点:

  1. 递归查询的起始条件:使用START WITH子句来指定递归查询的起始条件,即从哪个节点开始递归。
  2. 递归查询的递归条件:使用CONNECT BY PRIOR子句来指定递归查询的递归条件,即如何从一个节点递归到下一个节点。
  3. 递归查询的属性:在递归查询中,可以使用CONNECT_BY_ROOT关键字来获取根节点的属性,使用LEVEL关键字来获取当前节点在层次结构中的级别。
  4. 递归查询的排序:通过ORDER BY子句可以对递归查询的结果进行排序,可以按照根节点、级别等进行排序。
  5. 递归查询的限制:在处理大型数据集时,递归查询可能导致性能问题,可以通过设置递归查询的最大深度(MAXDEPTH)或者使用剪枝条件(PRUNE)来限制递归查询的范围。

递归查询在实际应用中有很多使用场景,例如处理组织架构、查找树形结构的子节点或父节点、获取层级结构的路径等。通过合理使用递归查询,可以简化复杂的数据处理操作,提高查询效率和代码的可读性。

相关文章:

【Oracle】Oracle语法之递归查询

目录 递归查询使用场景备注 语法相关属性解释 案例基本使用升级版-带上递归查询的属性 总结: 递归查询 Oracle的递归查询是指在一个查询语句中使用自引用的方式进行循环迭代查询。它可以用于处理具有层次结构的数据,如组织架构、产品类别等。递归查询通…...

【教程】Vue2中使用svg矢量图

1.npm导包 npm i svg-sprite-loader --save2.创建目录放入svg文件,创建SvgIcon.js 3.SvgIcon.js const req require.context(./svg, false, /\.svg$/) const requireAll requireContext > requireContext.keys().map(requireContext) requireAll(req)4.vue.c…...

简约唯美的404HTML源码

源码介绍 简约唯美的404HTML源码,很适合做网站错误页,将下面的源码放到一个空白的html里面,然后上传到服务器里面即可使用 效果预览 完整源码 <!DOCTYPE html> <html><head><meta charset="utf-8"><title>404 Error Example<…...

PDF 转图片并插入到 EXCEL 再转PDF

pom.xml 引用 <dependency><groupId>com.aspose</groupId><artifactId>aspose-cells</artifactId><version>21.11</version></dependency><dependency><groupId>com.aspose</groupId><artifactId>as…...

jmeter之变量随机参数化以及解决多线程不会随机变化

参考链接&#xff1a; https://www.cnblogs.com/Testing1105/p/12743475.html jmeter 使用random函数多线程运行时数据不会随机变化&#xff1f;_jmeter 线程组循环执行时 变量不变-CSDN博客 1、如下图所示&#xff0c;需要对请求参数 autor 和phone进行随机参数化 2、目前有…...

24/7/12总结

axios Axios 是一个基于 promise 网络请求库&#xff0c;作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生 node.js http 模块, 而在客户端 (浏览端) 则使用 XMLHttpRequests。 get请求: <script>function…...

sentinel网关限流配置及使用

sentinel控制台源码&#xff1a;https://download.csdn.net/download/yixin605691235/89543923 sentinel控制台jar包&#xff1a;https://download.csdn.net/download/yixin605691235/89543931 不同环境直接修改jar包中的application.yml文件中的nacos地址就可以了。 一、网关限…...

# 如何解决 App Store 审核中的 4.3(a) 问题:Guideline 4.3(a) - Design - Spam

如何解决 App Store 审核中的 4.3(a) 问题&#xff1a;Guideline 4.3(a) - Design - Spam 4.3(a) 审核问题是指&#xff1a;你的应用与其他开发者提交的应用在二进制文件、元数据和/或概念上存在相似之处&#xff0c;仅有微小差别。这通常会导致你的应用被视为垃圾应用而被拒绝…...

最长上升子序列(LIS)

最长上升子序列(最长递增子序列,LIS) 给定长度为 n n n的序列 v v v&#xff0c;求此序列中严格递增(上升)的子序列长度最大值(子序列可由原序列中不连续的元素构成) 朴素DP( O ( n 2 ) O(n^2) O(n2)) 闫氏DP分析法 状态表示&#xff1a; 集合 d p dp dp&#xff1a;所有满足…...

自动驾驶车道线检测系列—3D-LaneNet: End-to-End 3D Multiple Lane Detection

文章目录 1. 摘要概述2. 背景介绍3. 方法3.1 俯视图投影3.2 网络结构3.2.1 投影变换层3.2.2 投影变换层3.2.3 道路投影预测分支 3.3 车道预测头3.4 训练和真实值关联 4. 实验4.1 合成 3D 车道数据集4.2 真实世界 3D 车道数据集4.3 评估结果4.4 评估图像仅车道检测 5. 总结和讨论…...

手工创建 postgres kamailio 数据库

测试环境如下&#xff1a; postgres server 16&#xff1a; ip 地址为 192.168.31.100&#xff0c;用户 postgres 的密码为 ****** kamailio v5.7.5&#xff1a; ip 地址为 192.168.31.101 1.1. 创建 kamailio 用户和 kamailio 数据库 ssh 登陆 kamailio (192.168.31.101)&a…...

装饰设计模式

装饰设计模式应用在IO流上面可以得到体现 装饰模式指的是在不改变原类, 不使用继承的基础上&#xff0c;动态地扩展一个对象的功能。 原来的inputstream已经可以读取数据了&#xff0c;但是是一个字节一个字节的读取的&#xff0c;为了优化这个我们采用了buffered&#xff0c…...

Linux 线程初步解析

1.线程概念 在一个程序里的一个执行路线就叫做线程&#xff08;thread&#xff09;。更准确的定义是&#xff1a;线程是“一个进程内部的控制序列。在linux中&#xff0c;由于线程和进程都具有id,都需要调度等等相似性&#xff0c;因此都可以用PCB来描述和控制,线程含有PCB&am…...

为ppt中的文字配色

文字的颜色来源于ppt不可删去的图像的颜色 从各类搜索网站中搜索ppt如何配色&#xff0c;有如下几点&#xff1a; 1.可以使用对比色&#xff0c;表示强调。 2.可以使用近似色&#xff0c;使得和谐统一。 3.最好一张ppt中&#xff0c;使用的颜色不超过三种主要颜色。 但我想强调…...

python-区间内的真素数(赛氪OJ)

[题目描述] 找出正整数 M 和 N 之间&#xff08;N 不小于 M&#xff09;的所有真素数。真素数的定义&#xff1a;如果一个正整数 P 为素数&#xff0c;且其反序也为素数&#xff0c;那么 P 就为真素数。 例如&#xff0c;11&#xff0c;13 均为真素数&#xff0c;因为 11 的反序…...

TCP/IP、UDP、HTTP 协议介绍比较和总结

TCP/IP、UDP、HTTP是网络通信中的三种重要协议,各自具有不同的特点和应用场景。以下是对这三种协议的详细介绍、比较和总结。 TCP/IP协议 传输控制协议/互联网协议(TCP/IP, Transmission Control Protocol/Internet Protocol) 特点: 可靠性:TCP提供可靠的通信,通过握手…...

Unity Meta Quest 开发:如何在每只手指上添加 Poke 交互

XR 开发社区&#xff1a; SpatialXR社区&#xff1a;完整课程、项目下载、项目孵化宣发、答疑、投融资、专属圈子 找到玩家物体 OVRCameraRig 下的子物体 HandInteractorsRight/Left&#xff08;分别管理左右手的 Interactor&#xff09;下的 HandPokeInteractor 子物体&#x…...

MyBatis的原理?

MyBatis是一个优秀的持久层框架&#xff0c;它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数及获取结果集。MyBatis可以通过简单的XML或注解来配置和映射原生类型、接口和Java的POJOs&#xff08;Plain Old Java Objects&#xff09;为…...

数学基础【俗说矩阵】:齐次线性方程和非齐次线性方程求解-学习笔记

一、矩阵基础知识 二元一次方程的传统解法 不论是代入消元法还是加减消元法都统称 【高斯消元法】。 齐次方程组和非齐次方程组 线性方程组的解 线性方程的向量展示 向量规则 矩阵的高斯消元和初等行变行及其规则 高斯消元规则 初等行变换 矩阵经初等行变换成阶梯矩阵&…...

乐尚代驾项目概述

前言 2024年7月17日&#xff0c;最近终于在低效率的情况下把java及其生态的知识点背的差不多了&#xff0c;投了两个礼拜的简历&#xff0c;就一个面试&#xff0c;总结了几点原因。 市场环境不好 要知道&#xff0c;前两年找工作&#xff0c;都不需要投简历&#xff0c;把简历…...

无人机带多传感器就死机、数据不同步?做了 17 年工业主机研发,教你解决多设备协同的核心痛点

做了 17 年工业主机研发&#xff0c;我发现一个特别有意思的现象&#xff1a;很多客户的无人机&#xff0c;只带一个普通摄像头的时候&#xff0c;飞得稳稳当当&#xff0c;什么毛病都没有。但一旦加上激光雷达、毫米波雷达、热成像相机、多光谱相机这些传感器&#xff0c;就开…...

在Node.js服务中集成Taotoken实现统一的多模型调用网关

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 在Node.js服务中集成Taotoken实现统一的多模型调用网关 对于构建在Node.js上的后端服务&#xff0c;直接对接多个大模型供应商的AP…...

【Midjourney双色调风格终极指南】:20年视觉算法专家亲授3步精准复刻电影级Duotone效果

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;双色调美学的视觉起源与Midjourney适配性解析 双色调&#xff08;Duotone&#xff09;并非现代数字设计的发明&#xff0c;其视觉基因可追溯至19世纪的凹版印刷工艺——通过两块独立印版叠加单色油墨&#xf…...

深度解析猫抓Cat-Catch:从浏览器资源嗅探到流媒体处理的技术架构演进

深度解析猫抓Cat-Catch&#xff1a;从浏览器资源嗅探到流媒体处理的技术架构演进 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 猫抓Cat-Catch作为…...

5分钟极速上手:B站视频转文字工具bili2text完整指南

5分钟极速上手&#xff1a;B站视频转文字工具bili2text完整指南 【免费下载链接】bili2text Bilibili视频转文字&#xff0c;一步到位&#xff0c;输入链接即可使用 项目地址: https://gitcode.com/gh_mirrors/bi/bili2text 还在为整理B站视频内容而烦恼吗&#xff1f;每…...

终极微信聊天记录备份指南:免费开源工具WeChatExporter完整教程

终极微信聊天记录备份指南&#xff1a;免费开源工具WeChatExporter完整教程 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 你是否担心珍贵的微信聊天记录会因手机损坏或…...

终极智慧树自动刷课插件:告别手动操作,实现高效学习自动化

终极智慧树自动刷课插件&#xff1a;告别手动操作&#xff0c;实现高效学习自动化 【免费下载链接】zhihuishu 智慧树刷课插件&#xff0c;自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 还在为智慧树平台枯燥的视频学习而烦…...

波卡XCMP深度解析:跨链通信的核心标准与实战指南

波卡XCMP深度解析&#xff1a;跨链通信的核心标准与实战指南 引言&#xff1a;多链时代的“通信协议” 在区块链从“单链”走向“多链”甚至“链网”的演进中&#xff0c;跨链互操作性已成为决定生态繁荣与否的关键。波卡&#xff08;Polkadot&#xff09;提出的XCMP&#xff0…...

手把手教你用树莓派4B搭建个人服务器(保姆级图文教程,含SSH与远程桌面配置)

树莓派4B打造高性能个人服务器的终极指南 在当今数字化时代&#xff0c;拥有一个24小时在线的个人服务器不再是企业或技术巨头的专利。树莓派4B以其惊人的性价比和低功耗特性&#xff0c;正在重新定义个人服务器的可能性。想象一下&#xff0c;你的书架上安静运行着一台耗电仅5…...

终极指南:5分钟掌握XUnity自动翻译器,轻松实现Unity游戏汉化

终极指南&#xff1a;5分钟掌握XUnity自动翻译器&#xff0c;轻松实现Unity游戏汉化 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 还在为看不懂的日语游戏剧情而烦恼吗&#xff1f;面对满屏英文的游戏界…...