mysql8 recursive 用法、场景(orcale的connect by )

一篇文章成为递归大神:MySQL递归查询(with recursive) 文章包含了MySQL with Recursive 语法的概念,结合两个常用的查询案例,分析具体使用。 其中包括 向上递归案例,向下递归案例。 最后是 注意事项 和 总结 阅读详情

目录

准备工作

应用场景

问题1:我们需要加载这颗树

方法1:懒加载,首先加载根节点,然后点击节点时,根据点击节点的id加载子节点

方法2:预加载,后台需要写递归查询,然后组装树结构

问题2:查询101节点及其子节点⭐

总结


准备工作

DROP TABLE IF EXISTS `test_recursive`;

CREATE TABLE `test_recursive`  (
  `id` int(11) NULL DEFAULT NULL,
  `pid` int(11) NULL DEFAULT NULL,
  `node_name` varchar(255) NULL DEFAULT NULL
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

INSERT INTO `test_recursive`(`id`, `pid`, `node_name`) VALUES (1, NULL, '某某省1');
INSERT INTO `test_recursive`(`id`, `pid`, `node_name`) VALUES (101, 1, '某某市1_1');
INSERT INTO `test_recursive`(`id`, `pid`, `node_name`) VALUES (102, 1, '某某市1_2');
INSERT INTO `test_recursive`(`id`, `pid`, `node_name`) VALUES (103, 1, '某某市1_3');
INSERT INTO `test_recursive`(`id`, `pid`, `node_name`) VALUES (10101, 101, '某某县1_1_1');
INSERT INTO `test_recursive`(`id`, `pid`, `node_name`) VALUES (1010101, 10101, '某某区1_1_1_1');
INSERT INTO `test_recursive`(`id`, `pid`, `node_name`) VALUES (2, NULL, '某某省2');
INSERT INTO `test_recursive`(`id`, `pid`, `node_name`) VALUES (201, 2, '某某市2_1');
INSERT INTO `test_recursive`(`id`, `pid`, `node_name`) VALUES (20101, 201, '某某县2_1_1');

准备工作就是做了一个典型的树结构表,id代表主键,pid代表该id的父节点的id

某某省1
        某某市1_1
                某某县1_1_1
                        某某区1_1_1_1
        某某市1_2
        某某市1_3

某某省2
        某某市2_1
                某某县2_1_1

应用场景

问题1:我们需要加载这颗树

这就涉及到递归查询了

如果用代码写,我们需要多次请求数据库进行递归查询 组织这颗树结构

方法1:懒加载,首先加载根节点,然后点击节点时,根据点击节点的id加载子节点

findRoot();

findNodeByPid(String pid);

方法2:预加载,后台需要写递归查询,然后组装树结构

/**
    逻辑代码
*/
loadTree(){
    // 加载所有根节点
    list<Node> roots= sqlMapper.selectList("select * from xx where pid is null")
    // 遍历根节点组装子节点
    for(root:roots){
        flindChild(root)
    }
    return roots;
}

flindChild(node){
   list<Node> childs = sqlMapper.selectList("select * from xx where pid = #{node.id}")
   for(node:nodes){
       node.childs.add(node)
       // 递归调用
       findChild(node)   
   }
}

问题2:查询101节点及其子节点⭐

正常之前我们需要写递归查询然后拼接起来,或者写存储过程递归调用,现在我们可以直接用recursive 语法,让mysql帮我们完成递归查询一次性返回。

-- 创建一个临时递归视图
with recursive tree(id,pid,node_name) as (
    -- 根节点查询语句
    select id,pid,node_name from test_recursive roots where id = 101
		union all
    -- 子节点 join 递归视图 查询语句
    select c.id,c.pid,c.node_name from test_recursive c inner join tree on c.pid = tree.id
)
select * from tree;

问题3:列出1-100的所有数

with recursive rec(id) as (	
	select 1 as id
	union all
	select id +1 from rec where id <100
)
select id from rec

总结

with recursive xx(xx1,xx2,xx3) as () select xx1,xx2,xx3 from xx

这个语法就是创建一个临时递归视图(CTE 语法),mysql内置的递归查询语法,不同于后端写递归查询,我们不需要多次请求数据库,我们只需要根据查询结果进行组装即可,因此可以减轻mysql服务器负载,不过既然是递归,当数据量很大时,这样写压力依旧会很大

对递归出来的数据进行批量操作用这个语法比较方便

update xx where id in (with recursive xx(xx1,xx2,xx3) as () select id from xx)

另外该语法 mysql 8.x以上版本才有

防止递归次数过多导致的异常处理:

通过设置递归深度、最大执行时间来限制递归执行,能够强制结束递归

  • cte_max_recursion_depth 参数默认值为1000,限制递归深度,将被强制终止。

  • max_execution_time 参数限制查询的最大执行时间,超过该时间,也将被强制终止。

set xxx = x

使用MySQL进行Oracle Contact By操作 首先,我们选择指定的员工(在此示例中为ID为1的员工),并指定初始级别为0。然后,我们使用自连接将员工表与递归查询的结果进行连接,通过比较员工的manager_id和递归查询结果的id来找到下级员工。在Oracle中,我们可以使用"CONNECT BY"操作符实现递归查询,而在MySQL中并没有直接相应的操作符。通过使用递归查询和自连接,我们可以在MySQL中模拟实现Oracle的"CONNECT BY"操作。假设我们有一个名为"employees"的表,其中包含员工的信息,以及每个员工的上级ID。 阅读详情

相关推荐

MySQL中的内存不足问题导致CONNECT BY操作失败

在MySQL数据库中,CONNECT BY语句用于执行递归查询,常用于处理层次结构数据,例如组织架构或树状数据。然而,当数据库服务器的内存不足时,执行CONNECT BY语句可能会失败并导致性能问题。本文将详细介绍这个问题的原因,并提供一些解决方法。

CsmbPascal的博客 414

mysql8 实现connect by语法

mysql8 已只吃connect by语法

nayi_224的博客 2万+

MySQL 8.0 SQL实战习题集:从语法到执行计划的全链路训练

SQL 是关系型数据库的核心操作语言,其本质不仅是语法组合,更是对数据组织、查询优化与事务控制的系统性理解。掌握 SELECT、JOIN、窗口函数等基础语法只是起点,真正决定性能的是执行计划选择、索引利用效率与并发控制逻辑。MySQL 8.0 凭借完整 SQL:2011 标准支持、可调事务隔离级别及成熟的 Docker 部署生态,成为连接教学与工业实践的理想载体。本文聚焦真实场景下的 SQL 实战能力构建,覆盖慢查询定位、GROUP BY 合法性校验、相关子查询性能陷阱、事务原子性保障等高频痛点,并通过 6

weixin_34248705的博客 299

MySql递归RECURSIVE的详解

背景: 在实际开发的过程中,我们会遇到一些数据是层级关系的、要展示数据子父级关系的时候, 第一个解决方案:将数据库中的所有数据都查询出来用Java代码进行处理。 第二个解决方案:可以考虑MySql中的RECURSIVE递归进行数据的查询。 具体选择什么样的方法去实现,结合自己项目需求考虑。 目前有这样的一张关系属性表: 需求1 :找到名字为“隔壁老王”的所有的后代(父查子) -- 递归找出隔壁老王的所有的后代(父找子) WITH RECURSIVE temp(ID,USERNAME,PID,pName

qq_41934680的博客 8849

基于OkHttp3+Retrofit2+RxJava3搭建响应式网络框架

本文介绍了一个基于OkHttp3+Retrofit3+RxJava3的响应式网络框架设计。该框架采用分层架构,OkHttp3负责底层网络请求,Retrofit3封装HTTP接口,RxJava3实现响应式流处理。核心亮点包括:1)高度解耦的分层设计;2)统一的异常处理和响应体封装;3)RxJava3实现线程切换和请求管理;4)MVVM架构适配,业务层只需关注数据逻辑。框架提供了完整的实现方案,包括全局配置、拦截器、响应转换、接口声明、仓库封装等组件,并支持生产环境扩展功能如Cookie持久化、Token刷新等

fuge2008的博客 872

实战指南:UOS专业版命令行高效下载离线安装包及依赖

本文提供了一份UOS专业版离线安装包的实战下载指南。针对无外网环境下的软件部署难题,详细介绍了如何通过命令行精准获取软件包名,并利用`apt download`命令高效下载主程序及其所有依赖。文章重点解析了使用`apt install --dry-run`模拟安装来完整获取依赖包的方法,并给出了离线安装、问题排查及自动化脚本编写等高级技巧,帮助管理员和运维人员实现可靠的批量离线部署。

honey的博客 1110

Oracle的connect by level在MySQL中的华丽变身

虽然MySQL没有直接提供这样的语法,但通过不同的技术组合,我们仍然能够优雅地解决序列生成的问题。这正如编程世界的常态:条条大路通罗马,关键在于选择最适合当前环境的那一条。掌握这些跨数据库的转换技巧,不仅能提升我们的技术适应能力,更能加深对SQL语言本质的理解。下次当你面对不同数据库的语法差异时,希望这些方法能为你点亮一盏明灯!欢迎在评论区分享你在数据库迁移中遇到的有趣挑战和解决方案!关注我,学习更多的数据库知识!Oracle的connect by level在MySQL中的华丽变身。

老苏畅谈运维 1413

鱼眼双目测距实战:从OpenCV标定到SGBM匹配的完整流程解析

本文详细解析了鱼眼双目测距的完整流程,从OpenCV标定到SGBM匹配,涵盖标定、校正、匹配和测距四个关键阶段。通过实战经验分享,帮助开发者解决鱼眼镜头强畸变带来的测距挑战,提升测距精度至5%以内。特别适合机器人导航、自动驾驶和VR领域的开发者参考。

weixin_27298377的博客 124

Oracle CONNECT BY迁移MySQL:四种层级查询方案对比

在关系型数据库中,树形结构查询常用于组织架构、菜单权限、商品分类等场景。Oracle 通过 CONNECT BY 与 START WITH 以紧凑语法完成层级展开,而 MySQL 直到 8.0 才提供标准 WITH RECURSIVE,并可通过递归 CTE、存储过程加临时表、自连接、闭包表或路径枚举实现等价能力。其核心在于用初始查询定位根节点,用递归 JOIN 或逐层迭代表达父子关系,并手动维护层级、路径与排序字段。合适方案能显著降低数据库迁移成本,兼顾查询性能与维护复杂度,适用于部门树、评论盖楼、权限继承

weixin_34072296的博客 223

MATLAB/Simulink BLDC电机控制模型搭建:六步换相与速度环实战

无刷直流电机(BLDC)控制是电机驱动领域的核心技术,其六步换相原理通过霍尔信号控制逆变器开关,使定子磁场与转子磁场保持垂直以产生最大转矩。在MATLAB/Simulink中搭建BLDC控制系统,需从电机本体建模入手,结合PWM占空比调节和速度环PI控制器,实现速度闭环与波形观测。该技术广泛应用于电动工具、无人机电调和伺服驱动器等场景。本文详细解析BLDC六步换相逻辑、反电动势建模及Simulink分层设计方法,帮助读者掌握从零搭建完整控制模型的工程实践。

weixin_28273593的博客 210

从混乱到清晰:用QJsonObject重构你的Qt网络API数据解析层(避坑指南)

本文详细介绍了如何使用QJsonObject重构Qt网络API数据解析层,避免常见的JSON解析陷阱。通过安全解析模式、数据绑定和性能优化技巧,帮助开发者构建高效、健壮的解析逻辑,提升代码可维护性和可读性。特别适用于处理复杂嵌套的JSON响应数据场景。

weixin_29011667的博客 230

mysql8 递归查询父子集(临时表with recursive temp as)

背景 开发过程经常会遇到,需要查询某条记录parent_id相关联的父集数据或子集数据(例如层级数据:地区、菜单、评论、多次回访任务等),可使用mysql8的临时表(with recursive temp as)特性去查询。 1、Mysql 中需要使用 WITH RECURSIVE 2、Oracle数据库中可使用START [Param] CONNECT BY PRIOR 引入 计算1到100的累加的结果。 WITH RECURSIVE t(n) AS ( //t为我们结果表,n为字段,可以只指定表明不

leomoon 2434

Altium Designer(AD24/25)导入DXF或DWG结构文件的方法

DXF(Drawing Exchange Format)和DWG(Drawing)是两种常见的CAD(计算机辅助设计)文件格式,常用于结构和硬件之间的沟通。本文介绍Altium Designer(AD24/25)导入DXF或DWG结构文件的方法。

fydar的博客 1452

SQL 复杂递归层级遍历与树形路径展开:CONNECT BY 与 RECURSIVE CTE 终极性能对决

在企业组织架构权限穿透(Organization Hierarchy)、电商多级商品类目树展开、以及物料清单(BOM / Bill of Materials)多层级装配拆解中,数据天然呈现出两套语法在上到底有何本质差异?今天我们系统拆解两大递归流派的底层执行机制与生产级极速实战。

2401_85575345的博客 296

AI绘画与医疗可视化:用AI生成医学插图的实践

医疗可视化是医学教育、临床沟通和学术研究的核心工具。传统医学插图依赖手工绘制或专业3D建模,存在制作周期长、成本高、更新迭代慢等问题。随着深度学习技术的发展,AI绘画工具(如Stable Diffusion、DALL-E)展现出强大的图像生成能力,但医疗领域对插图的解剖准确性、标注规范性和语义完整性有极高要求,通用AI模型难以直接应用。本文聚焦AI技术与医疗领域的交叉创新,系统阐述如何通过数据预处理、模型定制化训练和后处理校验,构建符合医疗标准的插图生成系统。

大模型应用工坊 1788

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

递归查询(WITH RECURSIVE)应用

递归查询(WITH RECURSIVE)应用

weixin_44111939的博客 1923

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

递归SQL详解:从WITH RECURSIVE到CONNECT BY的树形查询实战

在数据库开发中,树形结构数据的存储与查询一直是个经典难题。无论是组织架构、商品分类还是权限菜单,都依赖父子关系表。递归SQL(Recursive SQL)通过让语句在限定次数内自我调用,将扁平表展开为完整树,是解决层级查询的高效手段。理解递归CTE(如MySQL/PostgreSQL的WITH RECURSIVE、SQL Server的CTE+OPTION、Oracle的CONNECT BY)的原理与差异,能显著提升复杂查询的开发效率。合理设置递归深度、为parent_id建索引并防范死循环,是工程落地的关

weixin_33178839的博客 294

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

MySQL递归查询迁移:WITH RECURSIVE、路径枚举与闭包表

在关系型数据库中处理树形结构、组织架构、BOM 展开或权限继承时,层级查询常需要递归展开。传统 Oracle 的 CONNECT BY 语义清晰,但迁移到 MySQL 后往往面临语法不兼容与性能取舍。递归 CTE(WITH RECURSIVE)通过锚点成员与递归成员逐层迭代,配合索引可高效展开父子链路;路径枚举与闭包表则用空间换时间,把祖先-后代关系预计算成可索引列或关系表。理解层级模型、递归深度控制与排序路径构造,能帮助在数据库迁移、无限级分类和物料清单等场景中选出更稳的 SQL 方案。

weixin_31315567的博客 249

递归SQL实战:用WITH RECURSIVE实现树形层级查询与报表加工

关系型数据库以二维表存储数据,但现实中的组织架构、商品分类等场景天然呈现树形结构。要在平铺的表中还原上下级关系,递归查询是绕不开的核心技术。递归CTE通过锚点成员与递归成员协同工作,逐层展开父子关系,无需预先知道树的深度,即可完成任意层级的遍历。这项能力在数据开发中价值显著,既能支撑组织架构的下钻与汇报链追溯,也能用于菜单树、评论楼层、物料清单等业务场景。理解执行机制后,还能进一步加工树形数据,例如计算团队人数、生成缩进文本或配合窗口函数做组内排序。本文以员工表为例,系统讲解递归SQL的写法、跨数据库差异以

weixin_29279153的博客 291

MySQL实现Oracle的层级查询技巧,CentOS安装Jenkins。

递归CTE是MySQL 8.0及以上版本的首选方案,语法简洁且性能较好。MySQL虽然没有直接等效的语法,但可以通过多种方式实现类似的效果。MySQL 8.0及以上版本支持递归CTE,这是实现层次化查询或生成序列的最佳选择。虽然语法复杂,但在不支持递归CTE的版本中是一种可行的替代方案。对于MySQL 5.7或更早版本,可以通过创建临时表或使用派生表生成序列。这种方法利用系统表的行数和变量生成序列,简单但依赖于系统表的行数。存储过程通过循环插入数据到临时表,最终返回生成的序列。,可以通过这些表生成序列。

2501_93988712的博客 258

Vitess v23.0.0 发布说明深度解析:标志命名迁移、MySQL 8.4 默认升级与 246 项合并变更

Vitess v23.0.0 是 Vitess 数据库集群系统在 MySQL 水平扩展方向上的一次里程碑式发布,包含 **246 个合并 Pull Request**,核心工作围绕三件大事展开:**989 个 CLI 标志从下划线命名整体迁移为短横线命名**(为 v25 移除旧格式铺路)、**默认 MySQL 大版本从 8.0 升级到 8.4(8.4.6)**、以及一批面向运维可观测性与 SQL

gitblog_00237的博客 407

MySQL 8.0–8.4 原子DDL与EXISTS真相:告别版本幻觉

MySQL作为主流关系型数据库,其DDL原子性与EXISTS语义是保障事务安全与查询性能的核心基础。原理上,原子DDL依赖InnoDB引擎演进(8.0.12起分阶段支持)和ALGORITHM=INSTANT等显式策略;EXISTS则本质是相关子查询,性能受索引覆盖与执行计划驱动,而非语法糖。技术价值在于避免线上误更新、重复建表、锁表中断等稳定性风险;典型应用场景涵盖高并发OLTP的在线变更、跨服务Trace链路构建、金融级账务SQL校验等。本文聚焦MySQL 8.0至8.4真实能力边界,解析原子DDL实现条

weixin_34326429的博客 377

递归查询实战:定位树形结构最上手与最下手节点的SQL方案

层级数据在组织架构、商品分类、评论回复等业务中无处不在,而处理这类数据的关键技术之一便是递归查询。递归查询的核心原理在于,无需预设树的深度,通过自底向上追溯父节点可定位根节点(最上手),通过自顶向下展开并过滤无子节点的记录则可获取叶子节点(最下手)。这种动态遍历方式不仅适应业务层级的频繁变化,更能高效支撑门店归属分析、末级SKU统计、数据血缘追溯等工程实践。然而,递归查询也暗藏循环引用、深度限制和性能陷阱,掌握防环策略与物化路径优化,是数据开发必备的进阶能力。本文从递归查询的基本概念出发,系统梳理最上手与最

weixin_29574585的博客 309

递归SQL与树形结构:从邻接表模型到无限层级场景的实战梳理

树形结构广泛存在于业务系统中,例如菜单权限、商品分类和组织架构,通常以parent_id邻接表建模。但随着层级加深、数据量增大,应用层循环查询带来的性能问题开始暴露。递归SQL利用WITH RECURSIVE的锚点成员与递归成员协同工作,通过一次数据库内迭代即可定位完整子树或祖先路径,在保证查询效果的同时显著降低代码复杂度。和闭包表、路径枚举等存储模型相比,邻接表加递归查询具备维护简单、通用性强的优势,特别适配数据层级动态变化、查询频繁多变的一线场景。本文以实际案例讲解树形数据的存储选型、递归SQL语法原理

weixin_42116058的博客 313

SQL笔记(目前记录 MySQL和PostgreSQL)

一、Mysql笔记 1、常用函数 参考:sql常用函数大全 2、Lpad()和Rpad()的用法 这是mysql的两个函数,用来填充某个字段的查询结果的 参考:SQL---Lpad()函数,Rpad()函数,数据库 二、PostgreSQL 笔记 1、字符串分隔函数(regexp_split_to_table、regexp_split_to_array) PostgreSQL 数据库提供 regexp_split_to_table 和 regexp_split_to_ar

qq_42199464的博客 2650
上一篇: neo4j查询两节点之间所有路径/关系
下一篇: spark读取Jdbc数据
JNWsong
博客等级 码龄9年 287粉丝 204原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值