MySQL8 CTE解决不定层级树形迭代问题

MySQL Common Table Expressions(CTE,公用表表达式)是在MySQL 8.0及更高版本中引入的一种高级SQL构造,它允许用户定义一个临时的结果集,这个结果集可以在同一个查询中被多次引用,从而简化复杂的查询逻辑和提高代码的可读性。通过 WITH 关键字定义,可以把复杂的子查询抽象出来,给其命名,提高查询的可读性和可维护性。在同一个查询中,可以多次引用同一个 CTE,无需重复书写相同子查询。

作用:

  1. 临时结果集定义:CTE允许你在查询中定义一个临时的、只在当前查询上下文中存在的中间结果集,就像一个临时的视图一样,但它不会持久化存储在数据库中。
  2. 递归查询支持:特别地,MySQL CTE还支持递归查询,这对于处理层次型数据(如组织架构、菜单树等)非常有用,能够方便地实现树形结构的遍历和展现。
  3. 查询复用:你可以在一个查询的不同部分多次引用同一个CTE,避免了在多个地方重复相同的子查询,减少了代码冗余。
  4. 查询分解:将复杂的查询逻辑分解成易于理解的部分,每一部分作为一个单独的CTE,这样可以增强查询的模块化和维护性。

下面案例说明运用CTE实现递归查询,创建表和插入数据:

CREATE TABLE employees (emp_id INT PRIMARY KEY,emp_name VARCHAR(100),manager_id INT,FOREIGN KEY (manager_id) REFERENCES employees(emp_id)
);INSERT INTO employees VALUES 
(1, 'CEO', NULL),
(2, 'Manager A', 1),
(3, 'Employee 1', 2),
(4, 'Employee 2', 2),
(5, 'Manager B', 1),
(6, 'Employee 3', 5);INSERT INTO employees VALUES 
(7, 'Employee 4', 2),
(8, 'Employee 5', 2),
(9, 'Employee 6', 5),
(10, 'Employee 7', 5),
(11, 'Manager C', 1),
(12, 'Employee 8', 11),
(13, 'Employee 9', 11),
(14, 'Employee 10', 11),
(15, 'Manager D', 1),
(16, 'Employee 11', 15),
(17, 'Employee 12', 15),
(18, 'Employee 13', 15),
(19, 'Manager E', 1),
(20, 'Employee 14', 19),
(21, 'Employee 15', 19),
(22, 'Employee 16', 2),
(23, 'Employee 17', 5),
(24, 'Employee 18', 11),
(25, 'Employee 19', 15),
(26, 'Employee 20', 19);

查询SQL:

-- 定义一个名为org_structure的递归公共表表达式(CTE),用于构建组织结构层次
WITH RECURSIVE org_structure AS (-- 初始化:选取公司最高级别(CEO)的员工信息SELECT emp_id, emp_name, manager_id, 1 AS level , CONCAT('',emp_id) as pathFROM employeesWHERE emp_name = 'CEO'UNION ALL-- 递归部分:通过JOIN操作连接employees表和已生成的org_structure表,获取下一级别的员工信息SELECT e.emp_id, e.emp_name, e.manager_id, os.level + 1 , CONCAT(os.path,',',e.emp_id) FROM employees eJOIN org_structure os ON e.manager_id = os.emp_id
)
-- 最终查询结果:从org_structure CTE中选择需要展示的字段,并按照层级(level)和员工ID(emp_id)排序
SELECT emp_id, emp_name, manager_id, level ,path
FROM org_structure
ORDER BY level, emp_id;

查询SQL解析:

通过WITH关键字定义了CTE(公共表达式块),同时增加递归关键字(RECURSIVE)。之所以增加递归,是因为需要在不定层级的情况下,一直深挖,直到没有数据为止。

递归的核心有两个规则:

1.因为要进行不定层级的递归,需要给出一个根节点。上面的SQL中是以‘CEO’为根节点。

2.进行递归的连接,对应UNION ALL下面的部分,用employees表与递归上一层的结果进行关联,关联条件是员工表中的manager_id与递归结果中的emp_id进行关联。

找到的数据会使用UNION ALL进行连接,只要manager_id与emp_id匹配的到数据,条件就会成立,一直会递归下去,直到匹配结束。

查询结果:

CTE表达式,其他用法,参考文章:

MySQL:CTE 通用表达式_mysql cte-CSDN博客 

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

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

相关文章

第六届国际科技创新学术交流大会暨信息技术与计算机应用学术会议(ITCA 2024)

重要信息 会议官网:itca2024.iaecst.org 会议时间:2024年12月06-08日 会议地点:中国-广州(越秀国际会议中心) 会议简介 第六届信息技术与计算机应用学术会议(ITCA 2024) 依旧作为第六届国际科技创新学术交流大会…

详解MVC架构与三层架构以及DO、VO、DTO、BO、PO | SpringBoot基础概念

🙋大家好!我是毛毛张! 🌈个人首页: 神马都会亿点点的毛毛张 今天毛毛张分享的是SpeingBoot框架学习中的一些基础概念性的东西:MVC结构、三层架构、POJO、Entity、PO、VO、DO、BO、DTO、DAO 文章目录 1.架构1.1 基本…

golang debug调试

1. 本地调试 1:Add Configurations 添加配置文件(Run kind :Directory) 2:进入run运行窗口 3:debug断点调试模式 1. Resume Program (继续运行) 图标: ▶️ 或 ► 快捷键: F9(Windows/Linux&a…

单点登录深入详解之技术方案总结

技术方案之CAS认证 概述 CAS 是耶鲁大学的开源项目,宗旨是为 web 应用系统提供一种可靠的单点登录解决方案。 CAS 从安全性角度来考虑设计,用户在 CAS 输入用户名和密码之后通过ticket进行认证,能够有效防止密码泄露。 CAS 广泛使用于传统应…

redis大key和热key

redis中大key、热key 什么是大key大key可能产生的原因大key可能会造成什么影响如何检测大key如何优化删除大key时可能的问题删除大key的策略 热key热key可能导致的问题解决热key的方法 什么是大key 大key通常是指占用内存空间过大或包含大量元素的键值对。 数据量大&#xff…

vue3实现自定义导航菜单

一、创建项目 1. 打开HBuilder X 图1 2. 新建一个空项目 文件->新建->项目->uni-app 填写项目名称:vue3demo 选择项目存放目录:D:/HBuilderProjects 一定要注意vue的版本,当前选择的版本为vue3 图2 点击“创建”之后进入项目界面 图…

Windows Qtcreator不能debug 调试 qt5 程序

Windows下 Qt Creator 14.0.2 与Qt5.15.2 正常release打包都是没有问题的,就是不能debug,最后发现是两者不兼容导致的; 我使用的是 编译器是 MinGW8.1.0 ,这个版本是有问题的,需要更新到最新,我更新的是Mi…

ubuntu20.04更换安装高版本CUDA以及多个CUDA版本管理

Ubuntu 20.04下多版本CUDA的安装与切换 CUDA安装配置环境变量软连接附上参考博客CUDA安装 cuda官方下载地址 因为我需要安装的是11.1版本的,所以这里按着11.1举例安装 安装命令如下: wget https://developer.download.nvidia.com/compute/cuda/11.1.0/local_installers/cu…

vue实现滚动条滑动到底部分页调取后端接口加载数据

一、案例效果 二、前提条件 接口返回数据 三、案例代码 子组件 const $emit defineEmits([cloneItem, updateList]);const props defineProps({rightList: {type: Array,},chartTableData: {type: Array as () > ChartListType[],},deleteChartInfo: {type: Object,}…

路面交通工具和个数识别,支持YOLO,COCO,VOC三种格式,带标注可识别自行车,摩的,公共汽车,装载机,面包车,卡车,轿车等

预处理 自动定向: 已应用 调整大小: 拉伸至 640x640 增强 每个训练示例的输出: 3 翻转: 水平 自行车 公交车

【05】Selenium+Python 两种文件上传方式(AutoIt)

上传文件的两种方式 一、input标签上传文件 可以用send_keys方法直接上传文件 示例代码 input标签上传文件import time from selenium import webdriver from chromedriver_py import binary_path # this will get you the path variable from selenium.webdriver.common.by i…

深入浅出剖析典型文生图产品Midjourney

2022年7月,一个小团队推出了公测的 Midjourney,打破了 AIGC 领域的大厂垄断。作为一个精调生成模型,以聊天机器人方式部署在 Discord,它创作的《太空歌剧院》作品,甚至获得了美国「数字艺术/数码摄影」竞赛单元一等奖。 这一事件展示了 AI 在绘画领域惊人的创造力,让人们…

[MRCTF2020]Transform

查壳,拖入64位IDA LOBYTE8位就是一个字节,在此处无意义,因为我们输入的本来就是按字节输入的 设 a byte_414040,bdword_40F040,cbyte_40F0E0,输入的字符串为flag; 从题目里得到 加密代码 a[i] flag[b[i]]; a[i] ^ b[i]; c a 即c[i] a[i…

如何通过智能生成PPT,让演示文稿更高效、更精彩?

在快节奏的工作和生活中,我们总是追求更高效、更精准的解决方案。而在准备演示文稿时,PPT的制作往往成为许多人头疼的问题。如何让这项工作变得轻松且富有创意?答案或许就在于“AI生成PPT”这一智能工具的广泛应用。我们就来聊聊如何通过这些…

深入浅出UART驱动开发与调试:从基础调试到虚拟驱动实现

往期内容 本专栏往期内容:Uart子系统 UART串口硬件介绍深入理解TTY体系:设备节点与驱动程序框架详解Linux串口应用编程:从UART到GPS模块及字符设备驱动 解UART 子系统:Linux Kernel 4.9.88 中的核心结构体与设计详解IMX 平台UART驱…

【docker】安装数据库脚本

mysql5.7 Docker启动mysql7并挂载文件关闭大小写敏感,【docker】安装mysql-CSDN博客 docker run \--name mysql -d -p 3306:3306 \-v /docker/data/mysql/data:/var/lib/mysql \-v /docker/data/mysql/conf:/etc/mysql/conf.d \-e MYSQL_ROOT_PASSWORD密码 \-e TZ…

1 ISP一键下载

BOOT0BOOT1启动模式说明0X用户Flash用户闪存存储器,也就是Flash启动10系统存储器系统存储器启动,串口下载11SRAM启动SRAM启动,用于在SRAM中调试代码 闪存存储器 是STM32 的内置FLASH,一般使用JTAG或者SWD模式下载程序时,就是下载…

1、Three.js开端准备环境

准备工作 从 CDN 导入 1.安装 VSCode 2.安装 Node.js 3.查看Three.js最新版本 4.如何cdn引入: https://cdn.jsdelivr.net/npm/threev版本号/build/three.module.js 例如:https://cdn.jsdelivr.net/npm/threev0.170.0/build/three.module.js 我们需要…

Java 反射(Reflection)

Java 反射(Reflection) Java 反射(Reflection)是一个强大的特性,它允许程序在运行时查询、访问和修改类、接口、字段和方法的信息。反射提供了一种动态地操作类的能力,这在很多框架和库中被广泛使用&#…

[保姆式教程]使用labelimg2软件标注定向目标检测数据和格式转换

定向目标检测是一种在图像或视频中识别和定位对象的同时,还估计它们方向的技术。这种技术特别适用于处理有一定旋转或方向变化的对象,例如汽车、飞机或文本。定向目标检测器的输出是一组旋转的边界框,这些框精确地包围了图像中的对象&#xf…