?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.pswp.cn/pingmian/71977.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/71977.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/71977.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Cursor 新手入門使用教程

一、Cursor 是什么&#xff1f; Cursor 是一個集成了 GPT-4、Claude 3.5 等先進 LLM&#xff08;大語言模型&#xff09;的類 VSCode 編譯器&#xff0c;可以理解為在 VSCode 中集成了 AI 輔助編程助手。從界面布局來看&#xff0c;Cursor 與 VSCode 基本一致&#xff0c;且使…

如何在Spring Boot中配置和使用MyBatis-Plus

在當今的Java開發中&#xff0c;Spring Boot已經成為了一個非常流行的框架&#xff0c;而MyBatis-Plus則是一個強大的ORM框架&#xff0c;為開發人員提供了更簡便的數據庫操作方式。很多開發者都在使用Spring Boot和MyBatis-Plus的組合來快速構建高效的應用。今天就來聊聊如何在…

【貪心算法3】

力扣1005.k次取反后最大化的數組和 鏈接: link 思路 既然要求最大和&#xff0c;那么不妨先給數組排個序&#xff0c;如果有負數&#xff0c;先處理負數從前往后給數組取反&#xff0c;如果負數處理完后k還有次數&#xff0c;此時數組全是正數了&#xff0c;只需要對第一個元…

自然語言處理中的語音識別技術:從聲波到語義的智能解碼

引言 語音識別&#xff08;Automatic Speech Recognition, ASR&#xff09;是自然語言處理&#xff08;NLP&#xff09;的關鍵分支&#xff0c;旨在將人類語音信號轉化為可處理的文本信息。隨著深度學習技術的突破&#xff0c;語音識別已從實驗室走向日常生活&#xff0c;賦能…

1688店鋪所有商品數據接口詳解

??一、接口概述淘寶開放平臺提供 1688.items.onsale.get/taobao.item_search_shop 接口&#xff0c;可批量獲取店鋪在售商品列表&#xff0c;包含商品 ID、標題、價格、銷量、圖片等核心信息。該接口適用于商品庫管理、競品監控、數據分析等場景 ?二、接口調用流程 前期準…

ArduPilot開源代碼之AP_OSD

ArduPilot開源代碼之AP_OSD 1. 源由2. 簡介3. 補丁4. 框架設計4.1 啟動代碼 (AP_OSD::init)4.2 任務代碼 (AP_OSD::osd_thread)4.3 實例初始化 (AP_OSD::init_backend) 5. 重要例程5.1 AP_OSD::update_stats5.2 AP_OSD::update_current_screen5.3 AP_OSD::update_osd 6. 總結7.…

qt open3dAlpha重建

qt open3dAlpha重建 效果展示二、流程三、代碼效果展示 二、流程 創建動作,鏈接到槽函數,并把動作放置菜單欄 參照前文 三、代碼 1、槽函數實現 void on_actionAlpha_triggered();//alpha重建 void MainWindow::

Deepseek可以通過多種方式幫助CAD加速工作

自動化操作&#xff1a;通過Deepseek的AI能力&#xff0c;可以編寫腳本來自動化重復性任務。例如&#xff0c;使用Python腳本調用Deepseek API&#xff0c;在CAD中實現自動化操作。 插件開發&#xff1a;結合Deepseek進行二次開發&#xff0c;可以創建自定義的CAD插件。例如&a…

Centos的ElasticSearch安裝教程

由于我們是用于校園學習&#xff0c;所以最好是關閉防火墻 systemctl stop firewalld systemctl disable firewalld 個人喜歡安裝在opt臨時目錄&#xff0c;大家可以隨意 在opt目錄下創建一個es-standonely-docker目錄 mkdir es-standonely-docker 進入目錄編輯yml文件 se…

c++ 調用 gurobi 庫,cmake,mac

gurobi 一般使用 python 調用&#xff0c;官方的培訓會議及資料大部分也都基于 python。 由于最近上手了 c&#xff0c;因此想試試 c 怎么調用 gurobi。但我發現&#xff0c;c 調用第三方庫比 python 或 java 要復雜不少。python 中直接 import 第三方庫&#xff0c;java 加載…

Python基于Django的醫用耗材網上申領系統【附源碼、文檔說明】

博主介紹&#xff1a;?Java老徐、7年大廠程序員經歷。全網粉絲12w、csdn博客專家、掘金/華為云/阿里云/InfoQ等平臺優質作者、專注于Java技術領域和畢業項目實戰? &#x1f345;文末獲取源碼聯系&#x1f345; &#x1f447;&#x1f3fb; 精彩專欄推薦訂閱&#x1f447;&…

Python中很常用的100個函數整理

Python 內置函數提供了強大的工具&#xff0c;涵蓋數據處理、數學運算、迭代控制、類型轉換等。本文總結了 100 個常用內置函數&#xff0c;并配備示例代碼&#xff0c;提高編程效率。 1. abs() 取絕對值 print(abs(-10)) # 10 2. all() 判斷所有元素是否為真 print(all([…

Python畢業設計選題:基于django+vue的疫情數據可視化分析系統

開發語言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7數據庫&#xff1a;mysql 5.7數據庫工具&#xff1a;Navicat11開發軟件&#xff1a;PyCharm 系統展示 管理員登錄 管理員功能界面 用戶管理 員工管理 疫情信息管理 檢測預約管理 檢測結果…

C#程序結構及基本組成說明

C# 程序的結構主要由以下幾個部分組成,以下是對其結構的詳細說明和示例: 1. 基本組成部分 命名空間 (Namespace) 用于組織代碼,避免命名沖突。通過 using 引入其他命名空間。 using System; // 引入 System 命名空間類 (Class) C# 是面向對象的語言,所有代碼必須定義在類或…

Python 編程題 第八節:字符串變形、壓縮字符串、三個數的最大乘積、判定字符是否唯一、IP地址轉換

字符串變形 swapcase()方法將字符串大小寫轉換&#xff1b;split()方法將字符串以括號內的符號分隔并以列表形式返回 sinput() ls.split(" ") ll[::-1] s"" for i in l:ai.swapcase()sas" " print(s[0:len(s)-1]) 壓縮字符串 很巧妙的方法 …

大語言模型學習--向量數據庫基礎知識

1.向量 向量是多維數據空間中的一個坐標點。 向量類型 圖像向量 文本向量 語音向量 Embedding 非結構化數據轉換為向量過程 通過深度學習訓練&#xff0c;將真實世界離散數據&#xff0c;投影到高維數據空間上&#xff0c;通過數據在空間中間的距離體現真實世界的相似度 V…

項目工坊 | Python驅動淘寶信息爬蟲

目錄 前言 1 完整代碼 2 代碼解讀 2.1 導入模塊 2.2 定義 TaoBao 類 2.3 search_infor_price_from_web 方法 2.3.1 獲取下載路徑 2.3.2 設置瀏覽器選項 2.3.3 反爬蟲處理 2.3.4 啟動瀏覽器 2.3.5 修改瀏覽器屬性 2.3.6 設置下載行為 2.3.7 打開淘寶登錄頁面 2.3.…

藍橋杯題型

藍橋杯 藍橋杯題型分類語法基礎藝術與籃球&#xff08;日期問題&#xff09;時間顯示&#xff08;時間問題&#xff09;跑步計劃&#xff08;日期問題&#xff09;偶串(字符&#xff09;最長子序列&#xff08;字符&#xff09;字母數&#xff08;進制轉換&#xff09;6個0&…

【C語言】文件操作篇

目錄 文件的基本概念文本文件和二進制文件的差異 文件指針FILE 結構體文件指針的初始化和賦值 文件打開與關閉常見操作文件的打開文件的關閉 常見問題打開文件時的路徑問題打開文件失敗的常見原因fclose 函數的重要性 文件讀寫操作常見操作字符讀寫字符串讀寫格式化讀寫二進制讀…

【leetcode hot 100 21】合并兩個有序鏈表

解法一&#xff1a;新建一個鏈表存放有序的合并鏈表。當list1和list2至少有一個非空時&#xff0c;返回非空的&#xff1b;否則找出兩個鏈表的最小值作為新鏈表的頭&#xff0c;然后依次比較兩鏈表&#xff0c;每次都先插入小的值。 /*** Definition for singly-linked list.*…