最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

mysql?WITH?RECURSIVE語法的具體使用

 更新時間:2024年07月30日 11:24:47   作者:dazhong2012  
WITH RECURSIVE是一個用于創(chuàng)建遞歸查詢的語句,本文主要介紹了mysql?WITH?RECURSIVE語法的具體使用,具有一定的參考價值,感興趣的可以了解一下

引言

在 SQL 中,WITH RECURSIVE 是一個用于創(chuàng)建遞歸查詢的語句。它允許你定義一個 Common Table Expression (CTE),該 CTE 可以引用自身的輸出。遞歸 CTE 非常適合于查詢具有層次結(jié)構(gòu)或樹狀結(jié)構(gòu)的數(shù)據(jù),例如組織結(jié)構(gòu)、文件系統(tǒng)或任何其他具有自引用關(guān)系的數(shù)據(jù)。

一、基本語法

WITH RECURSIVE cte_name (column1, column2, ...) AS (
  -- 非遞歸的初始部分,定義了 CTE 的起點(diǎn)
  SELECT ...
  FROM ...

  UNION ALL

  -- 遞歸部分,可以引用 CTE 的別名
  SELECT ...
  FROM cte_name
  WHERE ...
)
-- 最后的 SELECT 或其他 DML 語句,使用遞歸 CTE
SELECT * FROM cte_name;

二、示例

假設(shè)我們有一個表示組織結(jié)構(gòu)的表 employees,其中包含 id, manager_id 和 name 字段。manager_id 是員工的上級經(jīng)理的 id,如果 manager_id 是 NULL,則表示該員工是 CEO 或頂層經(jīng)理。

我們想要查詢整個組織結(jié)構(gòu)中的所有員工及其上級經(jīng)理。

WITH RECURSIVE employee_hierarchy (id, name, manager_id, path) AS (
  -- 非遞歸的初始部分:查找頂層經(jīng)理(沒有經(jīng)理的員工)
  SELECT
    id,
    name,
    manager_id,
    CONCAT(name, '/') AS path -- 使用 CONCAT 創(chuàng)建初始路徑
  FROM employees
  WHERE manager_id IS NULL
  
  UNION ALL
  
  -- 遞歸部分:查找所有下屬
  SELECT
    e.id,
    e.name,
    e.manager_id,
    CONCAT(e.name, '/', eh.path) AS path -- 將當(dāng)前員工添加到路徑中
  FROM employees e
  INNER JOIN employee_hierarchy eh ON e.manager_id = eh.id
)
SELECT * FROM employee_hierarchy;

在這個例子中:

  • WITH RECURSIVE 開始定義一個遞歸 CTE employee_hierarchy。
  • CTE 中的 column1, column2, … 是你想要在結(jié)果中選擇的列。
  • 初始查詢部分(在 UNION ALL 之前)定義了遞歸的起點(diǎn),通常是頂級節(jié)點(diǎn)或者查詢的基本情況。
  • 遞歸查詢部分(在 UNION ALL 之后)使用 CTE 的別名來引用自身的輸出,以便能夠遞歸地查詢下屬或子節(jié)點(diǎn)。
  • UNION ALL 用于合并初始查詢和遞歸查詢的結(jié)果,它允許重復(fù)的行,這是遞歸查詢的關(guān)鍵部分。
  • 最后的 SELECT * FROM employee_hierarchy; 是最終的查詢,它將返回 CTE 的全部結(jié)果。

遞歸 CTE 是 SQL 中處理分層數(shù)據(jù)的強(qiáng)大工具,但它們也可能很復(fù)雜,需要仔細(xì)設(shè)計(jì)以避免無限遞歸或不正確的結(jié)果。

三、實(shí)戰(zhàn)案例–查詢 最近12個月的診斷量數(shù)據(jù)

1. 按要求實(shí)現(xiàn)以下需求:

1.建表語句如下:

CREATE TABLE rkk_dzblzdl (
id int NOT NULL AUTO_INCREMENT COMMENT ‘id',
month varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ‘月份(1-12月)',
zdcs int DEFAULT NULL COMMENT ‘診斷次數(shù)',
xzqh varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ‘行政區(qū)劃',
PRIMARY KEY (id)
)COMMENT=‘電子病歷診斷量';

2.要求查詢 最近12個月的診斷量數(shù)據(jù),按行政區(qū)劃/月份 合并統(tǒng)計(jì);
3.結(jié)果返回 診斷次數(shù),月份,按月份排序;
4.返回 數(shù)據(jù)更新時間,取當(dāng)前最大的月份

2.實(shí)現(xiàn)結(jié)果

WITH RECURSIVE RecentMonths AS (  
    SELECT DATE_FORMAT(CURDATE(), '%Y-%m') AS month  
    UNION ALL  
    SELECT DATE_FORMAT(DATE_SUB(STR_TO_DATE(CONCAT(month, '-01'), '%Y-%m-%d'), INTERVAL 1 MONTH), '%Y-%m')  
    FROM RecentMonths  
    WHERE STR_TO_DATE(CONCAT(month, '-01'), '%Y-%m-%d') > DATE_SUB(CURDATE(), INTERVAL 12 MONTH)  
)  
  
SELECT   
    COALESCE(r.xzqh, rm.month) AS xzqh,   
    rm.month AS month,   
    SUM(r.zdcs) AS zdcs_count,  
    (SELECT MAX(month) FROM rkk_dzblzdl) AS last_updated_month_in_table  
FROM   
    RecentMonths rm  
LEFT JOIN   
    rkk_dzblzdl r ON rm.month = r.month  
GROUP BY   
    rm.month, r.xzqh  
ORDER BY   
    STR_TO_DATE(CONCAT(rm.month, '-01'), '%Y-%m-%d') DESC, r.xzqh;

這個查詢使用了遞歸的公用表表達(dá)式(CTE)RecentMonths 來生成最近12個月的月份列表。然后,它將這些月份與 rkk_dzblzdl 表進(jìn)行左連接,以便即使在某個月份沒有診斷數(shù)據(jù)時也能在結(jié)果集中顯示該月份。

COALESCE(r.xzqh, rm.month) 確保即使在某個月份沒有特定行政區(qū)劃的數(shù)據(jù)時,也能顯示月份。

MAX(rm.month) OVER () 是一個窗口函數(shù),用于在整個結(jié)果集上計(jì)算最大的月份,并作為 last_updated_month 返回。由于它是窗口函數(shù),所以它的值對于結(jié)果集中的每一行都是相同的。

最后,結(jié)果集按照月份降序和行政區(qū)劃升序進(jìn)行排序。

到此這篇關(guān)于mysql WITH RECURSIVE語法的具體使用的文章就介紹到這了,更多相關(guān)mysql WITH RECURSIVE內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mysql如何將一個字段賦值給另一個字段

    mysql如何將一個字段賦值給另一個字段

    這篇文章主要介紹了mysql如何將一個字段賦值給另一個字段,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • mysql 主從復(fù)制如何跳過報錯

    mysql 主從復(fù)制如何跳過報錯

    這篇文章主要介紹了mysql 主從復(fù)制如何跳過報錯,幫助大家更好的理解和使用MySQL 數(shù)據(jù)庫,感興趣的朋友可以了解下
    2020-10-10
  • 什么情況下需要創(chuàng)建MySQL索引?

    什么情況下需要創(chuàng)建MySQL索引?

    這篇文章主要介紹了什么情況下需要創(chuàng)建MySQL索引?本文同時介紹了哪些情況不適合創(chuàng)建MySQL索引,需要的朋友可以參考下
    2014-10-10
  • Mysql 實(shí)現(xiàn)向上遞歸查找父節(jié)點(diǎn)并返回樹結(jié)構(gòu)的示例代碼

    Mysql 實(shí)現(xiàn)向上遞歸查找父節(jié)點(diǎn)并返回樹結(jié)構(gòu)的示例代碼

    通過mysql 8.0以下版本實(shí)現(xiàn),一個人多角色id,一個角色對應(yīng)某個節(jié)點(diǎn)menu_id,根節(jié)點(diǎn)的父節(jié)點(diǎn)存儲為NULL, 向上遞歸查找父節(jié)點(diǎn)并返回樹結(jié)構(gòu),今天通過本文給大家介紹Mysql遞歸查找父節(jié)點(diǎn)并返回樹結(jié)構(gòu),感興趣的朋友一起看看吧
    2022-09-09
  • MySQL 數(shù)據(jù)庫表創(chuàng)建過程

    MySQL 數(shù)據(jù)庫表創(chuàng)建過程

    這篇文章主要介紹了MySQL 數(shù)據(jù)庫表創(chuàng)建過程,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2025-07-07
  • mysql中InnoDB事務(wù)隔離的記錄鎖、間隙鎖和臨鍵鎖

    mysql中InnoDB事務(wù)隔離的記錄鎖、間隙鎖和臨鍵鎖

    mysql中InnoDB默認(rèn)的事務(wù)隔離級別為可重復(fù)讀(Repeated Read, RR),我們當(dāng)下的所有介紹都是基于這個隔離級別為前提的,記錄鎖鎖定索引關(guān)聯(lián)的具體記錄,間隙鎖鎖定間隔,防止間隔中被其他事務(wù)插入,臨鍵鎖鎖定索引記錄+間隔,防止幻讀
    2023-12-12
  • MySQL通過ibd文件恢復(fù)數(shù)據(jù)的操作過程

    MySQL通過ibd文件恢復(fù)數(shù)據(jù)的操作過程

    通常,在InnoDB存儲引擎下,一個表由三部分組成:數(shù)據(jù)字典(.frm文件)、表空間(.ibd文件)和日志文件,其中,.frm文件存儲了表的定義,.ibd文件存儲了表的數(shù)據(jù)和索引,本文給大家記錄一次MySQL通過ibd文件恢復(fù)數(shù)據(jù)的操作過程,需要的朋友可以參考下
    2024-10-10
  • 在EF中使用MySQL的方法及常見問題

    在EF中使用MySQL的方法及常見問題

    這篇文章主要介紹了在EF中使用MySQL的方法及常見問題 的相關(guān)資料,需要的朋友可以參考下
    2016-06-06
  • MySQL的存儲引擎InnoDB和MyISAM

    MySQL的存儲引擎InnoDB和MyISAM

    這篇文章主要介紹了MySQL的存儲引擎InnoDB和MyISAM,MyISAM?用的是非聚集索引方式,即數(shù)據(jù)和索引落在不同的兩個文件上,下文更多相關(guān)內(nèi)容需要的小伙伴可以參考一下
    2022-04-04
  • MySQL 數(shù)據(jù)類型TINYINT、INT 和 BIGINT的區(qū)別及使用建議

    MySQL 數(shù)據(jù)類型TINYINT、INT 和 BIGINT的區(qū)別及使用建議

    TINYINT 適用于存儲小范圍整數(shù),INT 適用于大多數(shù)常見場景,BIGINT 適用于存儲非常大范圍的整數(shù),本文將詳細(xì)介紹這三種整數(shù)類型的區(qū)別、應(yīng)用場景和使用建議,感興趣的朋友跟隨小編一起看看吧
    2025-12-12

最新評論

宁安市| 乐东| 太保市| 容城县| 六安市| 玉溪市| 轮台县| 西平县| 平昌县| 怀仁县| 阿城市| 新巴尔虎左旗| 潮安县| 靖江市| 呼图壁县| 教育| 长岭县| 庆元县| 都兰县| 双柏县| 墨江| 徐水县| 城固县| 墨竹工卡县| 贡觉县| 株洲市| 周宁县| 巧家县| 台安县| 松滋市| 平乡县| 蕉岭县| 灵寿县| 长岛县| 博罗县| 堆龙德庆县| 永吉县| 庆云县| 连平县| 肥西县| 蕲春县|