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
英文地址,請注明出處:http://en.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;工作流提前導…