使用SQL递归查询树状结构,又可以跟同事吹牛了!

前言

在关系型数据库中,数据通常存储为二维表格(rows 和 columns)。然而,在实际业务中,很多场景下我们需要处理树状结构的数据,例如:

  1. 公司组织架构:从某个部门开始,查询其下属部门或员工。
  2. 商品分类:查询某个大类下的所有子类。
  3. 权限系统:根据某个角色,查询其子角色或权限继承关系。
  4. 评论区:查找某个评论的所有子评论。

树状数据的查询通常需要递归逻辑来处理,我看到很多人在业务代码中进行递归查询,如果数据量过大,会导致查询的次数过多,产生不必要的网络开销,而 SQL 中的递归查询(Recursive Query)正是为了解决这类问题。

本文将通过一个具体的 SQL 递归查询示例,来解释如何使用递归 CTE(Common Table Expression)来遍历和查询树状结构数据。

场景背景

假设我们有一个存储用户评论的数据库表 comment,其中包含以下字段:

  • id:评论的唯一标识
  • parent_id:父评论的ID(如果评论是根评论,则 parent_id 为空)

我们需要编写一个SQL查询,从某个特定的评论开始,递归地查询所有的子评论。比如,给定评论ID为 1,我们想要找到该评论的所有子评论以及其子评论的子评论。

SQL语句解析

先简单介绍一下 MySQL 递归查询的语法格式:

WITH RECURSIVE cte_name AS (-- 递归基:非递归部分,通常是初始化数据SELECT ...UNION ALL-- 递归步骤:递归逻辑,用于迭代查询SELECT ...
)
SELECT ...
FROM cte_name;

下面是实现递归查询的SQL语句:

WITH RECURSIVE `temp` AS (SELECTid,parent_id FROM`comment` WHEREid = 1UNION ALLSELECT`comment`.id,`comment`.parent_id FROM`comment`,`temp` WHERE`comment`.parent_id = `temp`.id
) 
SELECTid 
FROMtemp;

具体逻辑如下

1. WITH RECURSIVE temp AS (...)

这里定义了一个临时表 temp,它将递归地包含我们想要查询的结果。通过 RECURSIVE 关键字,允许SQL查询自身,即可以自引用。

2. 初始查询

SELECTid,parent_id 
FROM`comment` 
WHEREid = 1

该部分是递归查询的基准情况,表示首先从评论表中选取ID为 1 的那条评论作为查询起点,找到这条评论的 idparent_id

temp 表中的初始数据就来自于这里。

3. 递归部分

SELECT`comment`.id,`comment`.parent_id 
FROM`comment`,`temp` 
WHERE`comment`.parent_id = `temp`.id

temp 表包含了前一步获取的评论记录。在这一步中,SQL会从 comment 表中找到所有 parent_id 等于 temp.id 的评论,即所有子评论,并将它们再次加入 temp 表中。

递归会持续执行,直到没有更多匹配的子评论为止。

4. 最终查询

SELECTid 
FROMtemp;

最后,我们从递归生成的 temp 表中提取出所有的评论 id,这些 id 就是给定评论及其所有子评论的ID。

递归查询的工作流程

  • 基准步骤:首先查询ID为1的评论。
  • 递归步骤:接着查询其所有的子评论,并不断递归查询每个子评论的子评论,直到没有更多的子评论为止。

性能影响

递归查询是能够正常走索引的,但在查询大规模数据时,可能会带来性能问题,因为每次递归都是一次新的查询,但不管怎么样,它都好过于直接在业务中进行递归查询。

这是因为在查询相同数据时,SQL递归只需要一次网络io,但业务逻辑里进行递归查询SQL时,每一次递归都包含一次网络io。

支持的数据库

递归 CTE (WITH RECURSIVE) 对于某些老版本的数据库,可能并不适用。各个数据库支持的情况如下:

  • MySQL:8.0 及以上版本支持。
  • PostgreSQL:8.4 及以上版本支持。
  • SQL Server:2005 及以上版本支持,但语法稍有不同。
  • SQLite:3.8.3 及以上版本支持。
  • Oracle:11gR2 及以上版本支持(也支持 CONNECT BY 语法)。
  • MariaDB:10.2.2 及以上版本支持。

总结

这是一种简洁且强大的方法,值得在需要处理层次结构数据时进行应用。

如果你需要处理类似的树状数据,递归查询绝对是你应该掌握的利器!希望本文对你理解递归查询有所帮助。

你可以尝试在自己的数据库中执行类似的查询,并根据实际情况调整递归逻辑。欢迎留言讨论你的想法和问题!

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Python异常处理:自定义异常②

文章目录 1. 什么是自定义异常?2. 为什么需要自定义异常?3. 如何定义自定义异常?3.1 基本自定义异常3.2 带详细信息的自定义异常3.3 自定义异常的继承层次 4. 使用自定义异常4.1 抛出自定义异常4.2 捕获自定义异常 5. 自定义异常的应用场景5.…

二叉树——数据结构

这次我们来学习一下数据结构中的二叉树 1. 二叉树的概念及结构 1.1 二叉树的定义 定义:所有结点的度小于等于2的树。 上图中可以看出 二叉树不存在度大于2的结点二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树。 任意二叉树都…

2024年适合培训服务企业的7款CRM盘点

培训服务行业在线索管理、客户管理、数据分析、项目管理、师资管理和课程管理等方面,使用CRM可以事半功倍,最重要的是,可以用数据说话,找到降本增效的方向。 下面对培训服务行业常用测CRM做个盘点,包括国内比较头部的…

米壳AI:跨境电商必备:不损失原图的图片翻译工具!

嘿,跨境电商的小伙伴们! 今天来聊聊如何突破语言壁垒,让你的商品在国际市场上大放异彩。 随着 “一带一路” 战略的不断推进,跨境电商的发展势头愈发强劲。然而,语言障碍却成为了跨境交易中的一大难题。别担心&#x…

ppt组织结构图怎么增加分支?

在使用ppt里边的SmartArt来制作组织结构图的时候,我们发现里边的图形不够用,需要增加分支,这也就是大家近期问的ppt组织结构图怎么增加分支。今天设计学徒自学网小编就把具体的操作步骤分享给大家了,希望能帮助你们! …

RFID技术实现消防物资消防车无感化智能管理设计方案

在消防工作中,物资管理的高效性与准确性直接关系到救援行动的成败,传统的消防物资管理方式主要依赖人工记录和定期盘点,这种方式存在着诸多弊端。首先,人工记录容易出现错误,数据的准确性难以保证。例如,在…

制作U盘安装操作系统(启动盘、系统盘、Windows、Linux)

第一种(Windows) 官网windows制作启动盘 1. 打开Win11下载官网 下载 Windows 11https://www.microsoft.com/zh-cn/software-download/windows11 2. 下载制作操作系统工具 这里不要下载错了 3. 启动工具 选择U盘,选择你的U盘即可&#xf…

TASK-CUSTOMIZEDMASKED AUTOENCODERVIA MIXTURE OF CLUSTER-CONDITIONAL EXPERTS

发表于:ICLR 2023 notable top 25%(相当于spotlight) 推荐指数: #paper/⭐⭐⭐ 论文链接: Task-customized Masked Autoencoder via Mixture of Cluster-conditional Experts | OpenReview poster链接:ICLR 2023 Task-customized Masked Auto…

人类行为识别系统源码分享

人类行为识别检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

使用streaming-json-py插件处理JSON数据流:详细指南

目录 一、streaming-json-py简介 二、安装与配置 三、基本使用 示例1:处理不完整的JSON对象 示例2:处理不完整的JSON数组 四、高级用法 实时数据流分析 日志处理 五、性能优化与错误处理 六、总结与展望 在数据驱动的现代社会,实时处理数据流已成为许多应用和服务…

Linux·权限与工具-git与gdb

1. git工具 git是一款软件,发明它的人同时发明了Linux操作系统,也就是大名鼎鼎的Linus Torvalds 林纳斯托瓦兹。后来人们把git软件包装,产生了github、gitee等平台。 git产生的初衷就是便于进行多人协同管理,同时它还可以用来将本…

GB/T28181-2022相对老版本有哪些变动?

GB/T28181-2022新版概述 GB/T28181-2022是《公共安全视频监控联网系统信息传输、交换、控制技术要求》的国家标准,该标准在2022年12月30日发布,并于2023年7月1日正式实施。以下是关于GB/T28181-2022的详细解析: 一、标准概述 GB/T28181-20…

2024/9/18 模型的存储与读取

一、模型的存储与读取 主要涉及到torch.save和torch.load函数 新建两个python文件: 1.在model_save文件中保存模型(方式一)和模型参数(方式二) 2.在model_load文件中读取模型(方式一)和模型参数并装载模型(方式二)

海外绿色农业果蔬投资系统可以二开多语言

食品安全已经是全球非常重视,关于农业方面的基础建设投资都在大力推进,做一个绿色农业果蔬投资是一个非常不错的。希望这个系统能对你有很大的帮助!

三菱变频器变更电流最大输入(20mA 初始值)时的频率(60Hz初始值)

变更最高频率。变更示例 在4~ 20mA 输入频率设定器中,将 20mA 时的频率从 60Hz(初始值)变更为 50Hz。 输入 20mA 电流时调整为输出 50Hz。 将Pr.126 设定为“50Hz” NOTE 4mV 时的频率设定可通过校正参数 C5 设定。 其他的频率设定电流增益的调整方法,还…

泛微E-Mobile client/cdnfile 任意文件读取漏洞复现

0x01 产品简介 泛微E-Mobile是一款由泛微网络科技股份有限公司开发的移动办公产品,该产品专门为手机、平板电脑等移动终端用户设计,旨在提供便捷、高效的移动办公体验。适用于企业高管和有移动办公需求的业务部相关员工使用,特别适合于已有内部OA系统的大中型企业机构,尤其…

HBuilder无法打开微信开发者工具

配置微信开发工具路径之后,HBuilder无法打开微信开发者工具 使用HBuilder打开微信开发者工具的配置,官网有 运行至微信模拟器控制台报错 这个时候就需要打开微信开发者工具进行安全设置了

国外问卷调查怎么做的,新手怎么开始?

既然你准备进入这个行业,就应该明白一件事:这个项目,本质就是网络搬砖。 也就是你搬的越多、越快,就赚得越多。 做一份问卷,比如2美元,做50份,就是100美元,也就是700元左右。 月入…

好用的超声波清洗机有哪些?精选四大爆款品牌汇总

随着时代的发展及生活水平的提升,珠宝饰品、眼镜等个人物品日益普及至千家万户。然而,这些贵重小物在日常存放中难免会积累微尘与隐形细菌,无形中可能对我们的健康产生潜在影响。鉴于细菌的微小难察,超声波清洗机应运而生&#xf…

C++:日期类的实现

目录 一、前言 二、头文件 三、各个函数的实现 打印、检查日期及获取日期 、、-、-、 、<、<、>、>、 &#xff01; 日期-日期 >>、<< 一、前言 前面几篇讲了关于类和对象的一些知识&#xff0c;本篇就来实现一下前面用到的日期类。 二、头文…