MySQL: with as与with RECURSIVE如何混合使用?

文章目录

  • 一、with用法系列文章
  • 二、前言
  • 三、MySQL 普通CTE与递归CTE混合使用的严格规则
  • 四、解决方案
    • 4.1、方法1:嵌套查询
    • 4.2、方法2:使用临时表
    • 4.3、方法3:分开执行(应用层处理)

本文主要探讨mysqlwith普通cte递归cte如何混合使用。

一、with用法系列文章

关于with用法与with RECURSIVE的用法可以参考本人的另外两篇博文。

  • 《sql中with as用法/with-as 性能调优/with用法》
  • 《MYSQL的(WITH RECURSIVE)递归查询》

二、前言

在使用with RECURSIVE 递归查询的过程中,发现有一段sql是公共的,因此想把这部分sql提取出去,当做临时表。 with as子查询就可以当做临时表,所以我就在想能不能先用with as把公共部分查询成临时表,后面再跟着with RECURSIVE 递归查询。即with aswith RECURSIVE 混合使用。

经测试后发现先普通CTE再递归CTE时sql报错 ,所以我想知道是否能混合使用,本文就是来讨论这个问题。

sql示例如下:

-- 查询任务2子节点
WITH RECURSIVE cte AS (SELECT r.id,r.project_code, r.code, r.name,r.parent_project_code,r.parent_codeFROM t_ds_process_dependent_relation rinner join t_ds_process_definition d on r.project_code = d.project_code and r.code = d.code and r.version = d.versionWHERE r.code = 18418446171042 -- 任务2UNION ALLSELECT t.id,t.project_code, t.code, t.name,t.parent_project_code,t.parent_codeFROM t_ds_process_dependent_relation tinner join t_ds_process_definition d on t.project_code = d.project_code and t.code = d.code and t.version = d.versionINNER JOIN cte c ON t.parent_project_code = c.project_code and t.parent_code = c.code
)
SELECT * FROM cte;

在这里插入图片描述

在我的设想里,我想把公共部分提取成普通CTE, 然后在递归CTE中引用,但是这种语法在mysql中是错误的

错误SQL如下:

with relation as ( -- 普通CTESELECT r.id,r.project_code, r.code, r.name,r.parent_project_code,r.parent_codeFROM t_ds_process_dependent_relation rinner join t_ds_process_definition d on r.project_code = d.project_code and r.code = d.code and r.version = d.version),RECURSIVE cte AS ( -- 递归CTESELECT id,project_code, code, name,parent_project_code,parent_codeFROM relationWHERE code = 18418446171042 -- 任务2UNION ALLSELECT t.id,t.project_code, t.code, t.name,t.parent_project_code,t.parent_codeFROM relation tINNER JOIN cte c ON t.parent_project_code = c.project_code and t.parent_code = c.code
)
SELECT * FROM cte;

三、MySQL 普通CTE与递归CTE混合使用的严格规则

在 MySQL 中,不可以 先定义普通 CTE 再定义递归 CTE。这是 MySQL 与某些其他数据库(如 PostgreSQL)的一个重要语法差异。

MySQL 的严格规则

  • 必须将 RECURSIVE 关键字紧跟在 WITH 之后

  • 第一个 CTE 必须是递归 CTE(如果使用了 RECURSIVE 关键字)

  • 所有 CTE(包括普通 CTE)都必须放在同一个 WITH RECURSIVE 块中

正确写法示例:

WITH RECURSIVE-- 必须先定义递归CTErecursive_cte AS (-- 基础部分SELECT ...UNION ALL-- 递归部分SELECT ... FROM recursive_cte ...),-- 然后才能定义普通CTEnormal_cte AS (SELECT ... FROM ...)-- 主查询
SELECT ... FROM recursive_cte JOIN normal_cte ...

错误写法示例:

-- 这样写会报错!
WITHnormal_cte AS (SELECT ...),  -- 先普通CTERECURSIVE                   -- 后RECURSIVErecursive_cte AS (SELECT ...)
SELECT ...

四、解决方案

如果确实需要先处理普通 CTE 再处理递归 CTE,可以考虑以下方法:

4.1、方法1:嵌套查询

WITH RECURSIVE-- 将普通CTE的逻辑嵌入到递归CTE的基础部分recursive_cte AS (-- 基础部分包含普通CTE逻辑WITH normal_cte AS (SELECT ...)SELECT ... FROM normal_cte WHERE ...UNION ALL-- 递归部分SELECT ... FROM recursive_cte ...)
SELECT ... FROM recursive_cte;

4.2、方法2:使用临时表

-- 先创建临时表存储普通CTE结果
CREATE TEMPORARY TABLE temp_normal AS
SELECT ... FROM ...;-- 然后使用递归CTE
WITH RECURSIVE recursive_cte AS (SELECT ... FROM temp_normal ...
)
SELECT ... FROM recursive_cte;-- 最后删除临时表
DROP TEMPORARY TABLE temp_normal;

4.3、方法3:分开执行(应用层处理)

-- 第一个查询:执行普通CTE
SET @var = (SELECT ... FROM ...);-- 第二个查询:执行递归CTE
WITH RECURSIVE recursive_cte AS (SELECT ... WHERE ... = @var
)
SELECT ... FROM recursive_cte;

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

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

相关文章

腕管综合征 : “鼠标手”| “数字时代工伤”,在我国视频终端工作者中患病率达12%到15%。“

文章目录 引言 I 预防“鼠标手” 肌腱的滑动 正中神经的滑动 II “鼠标手”是怎么发生的? 症状 “鼠标手”的高发人群 引言 “鼠标手”发展到晚期会对神经造成不可逆的损伤。 早期刚开始有症状,比如说轻微的麻木,持续的时间也不长,发作频率也不高的情况下,我们可以通过像…

#C语言——刷题攻略:牛客编程入门训练(三):输出格式化、基本运算符

🌟菜鸟主页:晨非辰的主页 👀学习专栏:《C语言刷题合集》 💪学习阶段:C语言方向初学者 ⏳名言欣赏:"代码行数决定你的下限,算法思维决定你的上限。" 目录 1. 牛牛的空格分…

【ELasticsearch】集群故障模拟方案(二):磁盘空间满、重选主节点

《集群故障模拟方案》系列,共包含以下文章: 1️⃣ 集群故障模拟方案(一):节点宕机、节点离线2️⃣ 集群故障模拟方案(二):磁盘空间满、重选主节点 😊 如果您觉得这篇文章…

React中的Hooks

在React 16.8版本之前,组件主要分为两种:类组件(Class Components) 和 函数组件(Function Components)。类组件可以使用 state 来管理内部状态,也能使用生命周期方法(如 componentDi…

【21】C# 窗体应用WinForm ——图片框PictureBox属性、方法、实例应用

文章目录12. 图片框PictureBox12.2 PictureBox插入、删除图片12.2.1 插入方式一:右键导入12.2.2 插入方式二:程序路径读入12.2.3 删除图片:右键清除12.3 实例:一键实现图片交换12.4 图片与窗口尺寸——SizeMode属性——实例对比1 …

Vue-Router 4.0:新一代前端路由管理

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 🍚 蓝桥云课签约作者、…

vuhub Corrosion2靶场攻略

靶场下载: 下载地址:https://download.vulnhub.com/corrosion/Corrosion2.ova 靶场使用: 我这里是使用Oracle VirtualBox虚拟机打开靶场,使用VMware打开攻击机kali,要使这两个机器能互相通信,需要将这两…

定制开发开源AI智能名片S2B2C商城小程序的特点、应用与发展研究

摘要:本文聚焦定制开发开源AI智能名片S2B2C商城小程序,深入剖析其技术特点、功能优势。通过分析在实体店与线上营销、新零售闭环生态构建、智慧场景赋能以及微商品牌规范化运营等方面的应用,探讨其发展趋势。旨在为营销技术专家中的营销创客及…

ulimit参数使用详细总结

目录 1. 基本介绍 1.1 核心功能 1.2 作用范围 1.3 限制类型 2. 基本语法 3. 常用选项​ 3.1 常见options 3.2 查看当前限制 4. 核心概念 4.1 软限制(Soft Limit) 4.2 硬限制(Hard Limit) 5. 修改限制 5.1 临时修改 …

基于ASIC架构的AI芯片:人工智能时代的算力引擎

基于ASIC架构的AI芯片:人工智能时代的算力引擎在深度学习模型参数量呈指数级增长、训练与推理需求爆炸式发展的今天,通用处理器(CPU、GPU)在能效比和计算密度上的局限日益凸显。基于ASIC(Application-Specific Integra…

Linux信号机制:从硬件中断到用户态处理

当你在终端按下 CtrlC 时,一个简单的组合键触发了操作系统最精妙的异步通信机制。这种跨越硬件与软件的协作,正是Linux信号系统的精髓所在。本文将带你深入探索信号处理的全过程,从CPU中断到用户态函数调用,揭示Linux最强大的进程…

C语言基础:动态申请练习题

1. 动态申请一个具有10个float类型元素的内存空间&#xff0c;从一个已有的数组中拷贝数据&#xff0c;并找出第一次出现 12.35 的下标位置&#xff0c;并输出。#include <stdio.h> #include <stdlib.h> #include <string.h>int main() {// 动态申请10个flo…

MATLAB 实现 SRCNN 图像超分辨率重建

MATLAB 实现 SRCNN 图像超分辨率重建 MATLAB代码实现&#xff0c;用于基于三层卷积神经网络的图像超分辨率重建。代码参考了多个来源&#xff0c;结合了SRCNN的典型实现步骤。 1. MATLAB代码实现 % 超分辨率卷积神经网络(SRCNN)的测试代码 % 参考文献&#xff1a;Chao Dong, Ch…

知识蒸馏 - 基于KL散度的知识蒸馏 HelloWorld 示例

知识蒸馏 - 基于KL散度的知识蒸馏 HelloWorld 示例 flyfish 知识蒸馏 - 蒸的什么 知识蒸馏 - 通过引入温度参数T调整 Softmax 的输出 知识蒸馏 - 对数函数的单调性 知识蒸馏 - 信息量的公式为什么是对数 知识蒸馏 - 根据真实事件的真实概率分布对其进行编码 知识蒸馏 - …

从结构到交互:HTML5进阶开发全解析——语义化标签、Canvas绘图与表单设计实战

一、语义化标签进阶&#xff1a;重构页面结构的「逻辑语言」 在 HTML5 的舞台上&#xff0c;语义化标签是熠熠生辉的主角&#xff0c;它们为网页赋予了清晰的逻辑结构&#xff0c;使其更易被搜索引擎理解和被开发者维护。其中&#xff0c;<section>与<article>标签…

标准七层网络协议和TCP/IP四层协议的区别

分别是什么? OSI七层协议是国际标准组织制定的标准协议。其中七层分别是物理层,数据链路层,网络层,传输层,会话层,表示层,应用层。 TCP/IP协议是美国军方在后期网络技术的发展中提出来的符合目前现状的协议。其中四层分别是网络接口层对应七层中的物理层和数据链路层,…

前端面试手撕题目全解析

以下是前端面试中常遭遇的“手撕”基础题目汇总&#xff0c;涵盖 HTML→JS→Vue→React&#xff0c;每题附经典实现&#xff0f;原理解析&#xff0c;可现场答题或后端总结。 HTML 基础题 &#x1f4dd; 语义化卡片&#xff08;Semantic Card ARIA&#xff09; <article cl…

道格拉斯-普克算法 - 把一堆复杂的线条变得简单,同时尽量保持原来的样子

道格拉斯-普克算法 - 把一堆复杂的线条变得简单&#xff0c;同时尽量保持原来的样子 flyfish 道格拉斯-普克算法&#xff08;Douglas-Peucker Algorithm解决的问题其实很日常&#xff1a;把一堆复杂的线条&#xff08;比如地图上的道路、河流&#xff0c;或者GPS记录的轨迹&…

团购商城 app 系统架构分析

一、引言 团购商城 APP 作为一种融合了电子商务与团购模式的应用程序&#xff0c;近年来在市场上取得了显著的发展。它为用户提供了便捷的购物体验&#xff0c;同时也为商家创造了更多的销售机会。一个完善且高效的系统架构是保障团购商城 APP 稳定运行、提供优质服务的基础。本…

【AI平台】n8n入门7:本地n8n更新

✅0、前言 目标&#xff1a;本地n8n部署后&#xff0c;有新版本&#xff0c;然后进行更新。官方文档&#xff1a;Docker | n8n Docs特别说明&#xff1a; n8n镜像更新后&#xff0c;容器重建&#xff0c;所以之前在n8n配置的东西&#xff0c;就莫有了&#xff0c;工作流提前导…