✨SQL-递归CTE

📖 SQL魔法课堂:CTE「时间折叠术」全解

🎩 第一章:什么是CTE?

CTE(Common Table Expression) 就像 SQL 里的「临时笔记本」📒:

WITH 临时笔记本 AS (  SELECT ... FROM ...  -- 先写点笔记
)
SELECT * FROM 临时笔记本;  -- 再用笔记做分析

特点:
📌 临时性:仅在当前查询有效(像一次性草稿纸)
🧩 可复用:可在一个查询中多次引用
🪄 自描述:增强SQL可读性(比子查询更清晰)

🌟 第二章:递归CTE——时间魔法师

当CTE学会「自我复制」,它就成了处理树形结构、日期序列的利器!

🔮 经典结构:

WITH RECURSIVE 时间魔法师 AS (-- 🪄 初始咒语(锚点)SELECT 开始时间, 结束时间 FROM 时间表 WHERE...UNION ALL  -- 连接符-- 🔄 递归咒语(时间+1天)SELECT 开始时间, 结束时间 + 1天 FROM 时间魔法师 WHERE 结束时间 < 目标时间
)

举个栗子🌰:
把「2025-03-10 到 2025-03-12」的假期拆分成三天:

WITH RECURSIVE 拆分假期 AS (SELECT '2025-03-10' AS 假期日, '2025-03-12' AS 结束日UNION ALLSELECT 假期日 + 1 DAY, 结束日 FROM 拆分假期 WHERE 假期日 < 结束日
)
SELECT * FROM 拆分假期;

输出结果:

假期日结束日
2025-03-102025-03-12
2025-03-112025-03-12
2025-03-122025-03-12

🛠️ 第三章:CTE实战——假期拆分器

需求:把员工请假记录按天展开,并关联企业ID

WITH RECURSIVE 假期拆分器 AS (-- 🎯 锚点:获取原始请假单SELECT vacation_id,emp_id,ent_id,DATE(start_time) AS 开始日,DATE(end_time) AS 结束日FROM vacation WHERE emp_id = 1001UNION ALL-- ⏳ 递归:每天+1直到结束日SELECT vacation_id,emp_id,ent_id,开始日 + INTERVAL 1 DAY,结束日FROM 假期拆分器WHERE 开始日 < 结束日
)
SELECT ent_id,开始日 AS work_date,'holiday' AS type,vacation_id
FROM 假期拆分器
ORDER BY 开始日 DESC;

效果:

ent_idwork_datetypevacation_id
10012025-03-12holiday202
10012025-03-11holiday202
10012025-03-10holiday202

⚠️ 第四章:避坑指南

严格模式咬人🐞:

错误:1055 - Expression not in GROUP BY
解法:GROUP BY 必须包含所有非聚合字段

GROUP BY vacation_day, vacation_id, ent_id

递归深度限制:

默认最大递归100次,超长链需设置:

SET @@cte_max_recursion_depth = 365;  -- 允许拆一年假期

性能优化:

📌 索引:vacation(emp_id, start_time, end_time)
🚫 避免大表递归:超过1万行的递归可能变慢

💡 第五章:什么时候用CTE?

场景优点举个栗
多层嵌套查询代码更易读 🧐报表统计中的多步骤计算
递归结构处理轻松拆解树形数据🌲 组织架构、日期序列
临时结果复用避免重复计算⚡ 多个JOIN用同一子查询

✨ 总结:CTE的魔法三要素

清晰结构:WITH CTE名称 AS (...) 像写大纲
递归力量:UNION ALL + 终止条件 实现循环
严格模式生存法则:GROUP BY 要完整!

✨ DEMO:查询假期分页

WITH RECURSIVE vacation_days AS (SELECT vacation_id,emp_id,ent_id,  -- 明确包含需要输出的字段DATE(start_time) AS vacation_day,DATE(end_time) AS end_dayFROM vacation WHERE emp_id = #{emp_id}AND audit_status = 2AND del_flag = 0UNION ALLSELECT vacation_id,emp_id,ent_id,  -- 递归时保留必要字段vacation_day + INTERVAL 1 DAY,end_dayFROM vacation_daysWHERE vacation_day < end_day
)
SELECT vd.ent_id,DATE_FORMAT(vd.vacation_day, '%Y-%m-%d') AS work_date,'holiday' AS type,vd.vacation_id
FROM vacation_days vd
-- 修正分组条件(添加ent_id保证GROUP BY完整性)
GROUP BY vd.vacation_day, vd.vacation_id, vd.ent_id  
ORDER BY vd.vacation_day DESC
LIMIT #{pageSize} OFFSET #{offset};

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

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

相关文章

从零使用docker并安装部署mysql8.3.0容器

在开始使用docker到完成mysql的安装部署&#xff0c;中间有很多的坑等着 安装docker并配置 sudo yum install docker-ce 启动docker并设置开机启动项 sudo systemctl start docker sudo systemctl enable docker查看docker是否启动 sudo systemctl status docker 或者直接…

golang 静态库 Undefined symbol: __mingw_vfprintf

正常用golang编译一个静态库给 其他语言 调用&#xff0c;编译时报错 Error: Undefined symbol: __mingw_vfprintf 很是奇怪&#xff0c;之前用用golang写静态库成功过&#xff0c;编译也没问题&#xff0c;结果却是截然不同。 试了很多次&#xff0c;发现唯一的差别就是在 …

如何下载一些网上只提供了预览的pdf

有些网站上提供了pdf的预览&#xff0c;但是不提供下载入口 这时候用浏览器调出开发人员工具&#xff08;F12&#xff09;,找Fetch/XHR这个选项&#xff0c;里看启动器中有pdf的那个文件&#xff0c;点选 它。 然后就能找到它的网址了&#xff0c;直接把这个网址选中&#xff…

力扣-数组-34 在排序数组中查找元素的第一个和最后一个位置

思路和时间复杂度 思路&#xff1a;先找到中间数&#xff0c;如果没找到就返回{-1&#xff0c;-1}&#xff0c;如果找到了就以当前节点为中点&#xff0c;向两边扩时间复杂度&#xff1a; 代码 class Solution { public:vector<int> searchRange(vector<int…

一二三应用开发平台——能力扩展:多数据源支持

背景 随着项目规模的扩大&#xff0c;单一数据源已无法满足复杂业务需求&#xff0c;多数据源应运而生。 技术选型 MyBatis-Plus 的官网提供了两种多数据源扩展插件&#xff1a;开源生态的 <font style"color:rgb(53, 56, 65);">dynamic-datasource</fon…

NAFNet:Simple Baselines for Image Restoration

Abstract 近年来&#xff0c;图像复原技术取得了长足的进步&#xff0c;但现有的图像复原方法&#xff08;SOTA&#xff09;系统复杂度也在不断增加&#xff0c;不利于对各种方法的分析和比较。在本文中&#xff0c;我们提出了一种简单的基线&#xff0c;它超越了SOTA方法&…

python语言总结(持续更新)

本文主要是总结各函数&#xff0c;简单的函数不会给予示例&#xff0c;如果在平日遇到一些新类型将会添加 基础知识 输入与输出 print([要输出的内容])输出函数 input([提示内容]如果输入提示内容会在交互界面显示&#xff0c;用以提示用户)输入函数 注释 # 单行注释符&…

基于springboot和spring-boot-starter-data-jpa快速操作mysql数据库

1、创建springboot项目 2、pom.xml文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http:…

【Spring】基础/体系结构/核心模块

概述&#xff1a; Spring 是另一个主流的 Java Web 开发框架&#xff0c;该框架是一个轻量级的应用框架。 Spring 是分层的 Java SE/EE full-stack 轻量级开源框架&#xff0c;以 IoC&#xff08;Inverse of Control&#xff0c;控制反转&#xff09;和 AOP&#xff08;Aspect…

VMware安装Windows server 2016

1、新建虚拟机&#xff0c;选择自定义模式 2、选择兼容性 4、命名虚拟机 5、固件类型 EFI 虚拟磁盘类型&#xff0c;不同电脑推荐的类型不同&#xff0c;用默认的就行 删除声卡和打印机 检查网络配置 选择本地的Windows server 2016的系统镜像&#xff0c;系统镜像可以去Window…

【MySQL】增删改查进阶

目录 一、数据库约束 约束类型 NULL约束&#xff1a;非空约束 UNIQUE&#xff1a;唯一约束 DEFAULT&#xff1a;默认值约束 PRIMARY KEY&#xff1a;主键约束 FOREIGN KEY&#xff1a;外键约束 二、表的设计 三、新增 四、查询 聚合查询 聚合函数 GROUP BY子句 HA…

使用Process Explorer、Dependency Walker和PE信息查看工具快速排查dll动态库因库与库版本不一致导致的加载失败问题

目录 1、问题说明 2、使用Process Explorer查看目标dll动态库有没有动态加载起来 3、使用Dependency Walker查看xxpadll.dll库的库依赖关系&#xff0c;找到xxpadll.dll加载失败的原因 4、使用PE信息查看工具查看目标dll库的时间戳 5、关于xxsipstack2.dll中调用xxdatanet…

NCCL如何打印XML拓扑文件,操作说明和源码展示

NCCL源码解读的视频在这&#xff1a;NCCL集合通信源码解读、案例、任务调度、拓扑_哔哩哔哩_bilibili 一、环境变量设置 1.1 命令行环境变量设置 为了打印XML拓扑文件&#xff0c;需要设置NCCL的环境变量NCCL_TOPO_DUMP_FILE。这个环境变量指定了XML拓扑文件的输出路径和文件…

时序数据库 TDengine 化工新签约:存储降本一半,查询提速十倍

化工行业在数字化转型过程中面临数据接入复杂、实时性要求高、系统集成难度大等诸多挑战。福州力川数码科技有限公司科技依托深厚的行业积累&#xff0c;精准聚焦行业痛点&#xff0c;并携手 TDengine 提供高效解决方案。通过应用 TDengine&#xff0c;力川科技助力化工企业实现…

Maven的学习以及安装配置 2024/3/1 idea

1. Maven的安装 1.1 首先查看编程工具合适的Maven版本 我使用的是2024/3/1 版本的idea&#xff0c;接下来我会用这个版本的idea进行演示。idea没有汉化的也可以参考我的步骤。 1、打开idea的设置&#xff0c;搜索Maven&#xff0c;进入Maven设置。 我们可以看到&#xff0c;…

kubernetes——part3-5 核心概念 Service

一、 service作用 使用kubernetes集群运行工作负载时&#xff0c;由于Pod经常处于用后即焚状态&#xff0c;Pod经常被重新生成&#xff0c;因此Pod对应的IP地址也会经常变化&#xff0c;导致无法直接访问Pod提供的服务&#xff0c;Kubernetes中使用了Service来解决这一问题&am…

【脚本】Linux一键扩大虚拟内存的大小

Linux增加虚拟内存其实很简单 就那几个命令&#xff0c;free、mkswap、swapon 但是方便起见我写成了脚本 使用方法 进入你的目录&#xff0c; nano ./install_swap.sh 下面的脚本全文复制&#xff0c;粘贴进去之后&#xff0c;按ctrlx后按y保存 然后运行以下命令 sudo bash …

学习 MySQL 需要知道的 28 个小技巧

前言 随着信息技术的不断发展以及互联网行业的高速增长&#xff0c;作为开源数据库的MySQL得到了广泛的应用和发展。目前MySQL已成为关系型数据库领域中非常重要的一员。 无论是运维、开发、测试&#xff0c;还是架构师&#xff0c;数据库技术都是一个 必备加薪神器&#xff…

【Hive】Hive安装

Hive 第一章 Hive的基础知识 第二章 Hive安装 第三章 DDL&#xff08;Data Definition Language&#xff09;数据定义 第四章 DML&#xff08;Data Manipulation Language&#xff09;数据操作 第五章 Hive查询 第六章 Hive的基础知识 第七章 Hive函数 第八章 分区表和分桶表 …

6.聊天室环境安装 - Ubuntu22.04 - elasticsearch(es)的安装和使用

目录 介绍安装安装kibana安装ES客户端使用 介绍 Elasticsearch&#xff0c; 简称 ES&#xff0c;它是个开源分布式搜索引擎&#xff0c;它的特点有&#xff1a;分布式&#xff0c;零配置&#xff0c;自动发现&#xff0c;索引自动分片&#xff0c;索引副本机制&#xff0c;res…