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

SQL SERVER遞歸查詢的實(shí)現(xiàn)

 更新時(shí)間:2024年01月03日 11:19:07   作者:MoFe1  
本文主要介紹了SQL SERVER遞歸查詢的實(shí)現(xiàn),遞歸查詢是通過CTE來實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下

 有示例數(shù)據(jù),表名為SYS_Department

iddepartmentNameparentIdremarkisEnablestaffId
2總經(jīng)理1總經(jīng)理1
3賬務(wù)部2賬務(wù)部11006
4技術(shù)部2技術(shù)部11004
9產(chǎn)品部2產(chǎn)品部11005
10市場(chǎng)部2市場(chǎng)部1
11人事部2人事部11013
5測(cè)試部4測(cè)試部11002
6開發(fā)部4開發(fā)部11003
7設(shè)計(jì)部4設(shè)計(jì)部1
8物聯(lián)部4物聯(lián)部1
12JAVA一部6JAVA一部11009
13JAVA二部6JAVA二部1
14.NET部6.NET部11008
15前端部6前端部1

遞歸查詢?cè)?/p>

SQL Server中的遞歸查詢是通過CTE(表表達(dá)式)來實(shí)現(xiàn)。至少包含兩個(gè)查詢,第一個(gè)查詢?yōu)槎c(diǎn)成員,定點(diǎn)成員只是一個(gè)返回有效表的查詢,用于遞歸的基礎(chǔ)或定位點(diǎn);第二個(gè)查詢被稱為遞歸成員,使該查詢稱為遞歸成員的是對(duì)CTE名稱的遞歸引用是觸發(fā)。在邏輯上可以將CTE名稱的內(nèi)部應(yīng)用理解為前一個(gè)查詢的結(jié)果集。

遞歸查詢語法

with 子查詢名稱 查詢字段列表 as --查詢字段列表輸入格式為([查詢字段名1],[查詢字段名2],...),也可用*代替,需要注意的是此處的查詢字段列表中的字段與下方內(nèi)容中定點(diǎn)成員與遞歸成員查詢字段列表內(nèi)容需一致
( 
--定點(diǎn)成員
select 查詢字段列表 from 查詢表名 where 查詢條件 
union all 
--遞歸成員
select 查詢字段列表 from 查詢表名 a inner join 子查詢名稱 on 遞歸條件 ) 
select 顯示字段名 from 子查詢名稱

已示例數(shù)據(jù)為例

--查詢1
--通過根節(jié)點(diǎn)向下查找該根節(jié)點(diǎn)下的子節(jié)點(diǎn)
with temp([id],[departmentName],[parentId])  as --temp([id],[departmentName])指定temp結(jié)果集中的列,如設(shè)置需包含聯(lián)表?xiàng)l件
( select [id],[departmentName],[parentId] from SYS_Department where id = 2
union all select a.[id],a.[departmentName],a.[parentId] from SYS_Department a inner join temp on a.[parentId] = temp.[id] ) 
select  [id],[departmentName] from temp

--查詢2
--通過子節(jié)點(diǎn)向上查找該子節(jié)點(diǎn)的根節(jié)點(diǎn)
with temp([id],[departmentName],[parentId])  as 
( select [id],[departmentName],[parentId] from SYS_Department where id = 2
union all select a.[id],a.[departmentName],a.[parentId] from SYS_Department a inner join temp on
--調(diào)換查詢字段
a.[id] = temp.[parentId] ) 
select  [id],[departmentName] from temp

查詢2查詢結(jié)果

mysql示例 使用recursive關(guān)鍵字

--Mysql 查詢時(shí)聯(lián)表?xiàng)l件與SQL SERVER相反
--父查子
with recursive temp(Id,DepartmentName,ParentId) as 
(select Id,DepartmentName,ParentId from SYS_Department  where id = 2
union all 
select a.Id,a.DepartmentName,a.ParentId from SYS_Department a inner join temp on a.ParentId  = temp.Id)
select * from temp

--子查父
with recursive temp(Id,DepartmentName,ParentId) as 
(select Id,DepartmentName,ParentId from SYS_Department  where id = 2
union all 
select a.Id,a.DepartmentName,a.ParentId from SYS_Department a inner join temp on a.Id = temp.ParentId )
select * from temp

不指定查詢字段列表

--查詢1
--不指定子查詢查詢字段列表
with temp as 
(
--查詢表中所有字段 
select * from SYS_Department where id = 2
union all 
--查詢主表中所有字段(根據(jù)UNION ALL語法需與定點(diǎn)成員查詢字段保持一致)
select a.* from SYS_Department a inner join temp on a.[parentId] = temp.[id] ) 
--顯示表中所有字段
select * from temp

--查詢2
--不指定子查詢查詢字段列表
with temp as 
(
--查詢表中所有字段 
select * from SYS_Department where id = 2
union all 
--查詢主表中所有字段(根據(jù)UNION ALL語法需與定點(diǎn)成員查詢字段保持一致)
select a.* from SYS_Department a inner join temp on a.[parentId] = temp.[id] ) 
--顯示表中id字段
select id from temp

查詢結(jié)果1

查詢結(jié)果2

 總結(jié):

以樹的概念去理解查詢?cè)砜赡芟鄬?duì)比較容易一些,以下是以結(jié)果反推的個(gè)人理解:

關(guān)鍵字:

定點(diǎn)成員(示例語句中:select * from SYS_Department where id = 2)

遞歸成員(示例語句中:select a.* from SYS_Department a inner join temp on a.[parentId] = temp.[id])

拼接(使用UNION ALL)

SQL遞歸查詢是以定點(diǎn)成員為查詢起始點(diǎn)(即語句中的select * from SYS_Department where id = 2),第一次查詢時(shí)取到定點(diǎn)成員的子節(jié)點(diǎn)(即示例數(shù)據(jù)中parentid=2的數(shù)據(jù),可以將查詢起始點(diǎn)理解為樹的根節(jié)點(diǎn)),通過特定的順序遍歷取到的子節(jié)點(diǎn)(遍歷順序經(jīng)測(cè)試為倒序遍歷,即先遍歷id=4的數(shù)據(jù),再遍歷id=3的數(shù)據(jù)),當(dāng)該子節(jié)點(diǎn)下存在數(shù)據(jù)時(shí)(即已select a.* from SYS_Department a inner join temp on a.[parentId] = temp.[id]的查詢結(jié)果不為NULL時(shí))顯示數(shù)據(jù)并繼續(xù)遍歷該節(jié)點(diǎn),直至查詢導(dǎo)的結(jié)果為空或達(dá)到最大的迭代次數(shù)(默認(rèn)為100),最終將所有節(jié)點(diǎn)遍歷完成并將遍歷的結(jié)果以UNION ALL語句拼接輸出結(jié)果集。

以示例數(shù)據(jù)為例,反推的查詢流程以及數(shù)據(jù)如圖所示:

 1.第一次遞歸時(shí)(目前無法確定開始執(zhí)行的順序是先執(zhí)行定點(diǎn)成員語句后遞歸還是獲取到子節(jié)點(diǎn)后遞歸,猜測(cè)順序?yàn)閳?zhí)行完定點(diǎn)成員SQL后進(jìn)行第一次遞歸)獲取拼接下圖中

2.遞歸遍歷通過定點(diǎn)成員獲取到的子節(jié)點(diǎn),先遍歷id=11的節(jié)點(diǎn),但該節(jié)點(diǎn)下獲取的數(shù)據(jù)為空所以不拼接任何數(shù)據(jù),id=10和9的同理,當(dāng)遍歷到id為4的節(jié)點(diǎn)時(shí),獲取拼接下圖數(shù)據(jù)

 3.遞歸遍歷上圖中獲取到的節(jié)點(diǎn),先遍歷id=8的節(jié)點(diǎn),但該節(jié)點(diǎn)下獲取的數(shù)據(jù)為空所以不拼接任何數(shù)據(jù),id=7和5的同理,當(dāng)遍歷到id為6的節(jié)點(diǎn)時(shí),獲取拼接下圖數(shù)據(jù)

 4.遞歸遍歷上圖中獲取到的節(jié)點(diǎn),先遍歷id=15的節(jié)點(diǎn),但該節(jié)點(diǎn)下獲取的數(shù)據(jù)為空所以不拼接任何數(shù)據(jù),id=14,13,12的節(jié)點(diǎn)同理

5.此時(shí)以id=4的節(jié)點(diǎn)為根節(jié)點(diǎn)的所有節(jié)點(diǎn)已遍歷完成,繼續(xù)遞歸遍歷通過定點(diǎn)成員獲取到的子節(jié)點(diǎn),即遍歷id=3的節(jié)點(diǎn),但該節(jié)點(diǎn)下獲取的數(shù)據(jù)為空所以不拼接任何數(shù)據(jù),最終顯示結(jié)果集如下圖所示

 原文參考:

WITH common_table_expression (Transact-SQL) | Microsoft Docs

Recursive Queries Using Common Table Expressions | Microsoft Docs

思路借鑒:SQL中的遞歸的用法_SQL數(shù)據(jù)庫開發(fā)的博客-CSDN博客

到此這篇關(guān)于SQL SERVER遞歸查詢的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)SQL 遞歸查詢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 關(guān)于MySQL查詢語句的優(yōu)化詳解

    關(guān)于MySQL查詢語句的優(yōu)化詳解

    這篇文章主要介紹了MySQL查詢語句的優(yōu)化方法,分別介紹了子查詢優(yōu)化,分頁查詢優(yōu)化以及排序查詢優(yōu)化,對(duì)學(xué)習(xí)有一定的幫助,需要的小伙伴可以參考一下
    2023-04-04
  • Mysql之如何創(chuàng)建函數(shù)問題

    Mysql之如何創(chuàng)建函數(shù)問題

    這篇文章主要介紹了Mysql之如何創(chuàng)建函數(shù)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Mysql簡(jiǎn)易索引方案講解

    Mysql簡(jiǎn)易索引方案講解

    這篇文章主要為大家介紹了Mysql索引如何實(shí)現(xiàn)更加簡(jiǎn)易的查找方案,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • MySQL有5種索引類型及其特點(diǎn)詳解

    MySQL有5種索引類型及其特點(diǎn)詳解

    MySQL中的索引類型多種多樣,每種索引類型都有其特定的使用場(chǎng)景和優(yōu)勢(shì),這篇文章主要介紹了MySQL有5種索引類型及其特點(diǎn)的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2026-01-01
  • Navicat for Mysql 字段注釋中文亂碼問題及解決

    Navicat for Mysql 字段注釋中文亂碼問題及解決

    這篇文章主要介紹了Navicat for Mysql 字段注釋中文亂碼問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • mysql5.7安裝教程(windows)

    mysql5.7安裝教程(windows)

    這篇文章主要為大家詳細(xì)介紹了windows下mysql5.7安裝教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • 從0到1學(xué)會(huì)MySQL單表查詢

    從0到1學(xué)會(huì)MySQL單表查詢

    這篇文章主要給大家介紹了關(guān)于如何從0到1學(xué)會(huì)MySQL單表查詢的相關(guān)資料,單表查詢是指從一張表數(shù)據(jù)中查詢所需的數(shù)據(jù),文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • MySQL多條件查詢的實(shí)現(xiàn)示例

    MySQL多條件查詢的實(shí)現(xiàn)示例

    本文主要介紹了MySQL多條件查詢的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-05-05
  • mysql 8.0.12 winx64下載安裝教程

    mysql 8.0.12 winx64下載安裝教程

    這篇文章主要為大家詳細(xì)介紹了mysql 8.0.12 winx64下載安裝教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • mysql大批量插入數(shù)據(jù)的4種方法示例

    mysql大批量插入數(shù)據(jù)的4種方法示例

    這篇文章主要給大家介紹了關(guān)于mysql大批量插入數(shù)據(jù)的4種方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用mysql具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06

最新評(píng)論

天津市| 南昌市| 武城县| 桐庐县| 孝昌县| 伊宁市| 库尔勒市| 辽阳县| 正镶白旗| 手游| 安龙县| 宾阳县| 普宁市| 都匀市| 巨野县| 焦作市| 新密市| 乌兰浩特市| 金门县| 湾仔区| 昭通市| 临朐县| 白河县| 宜城市| 常熟市| 靖西县| 桐庐县| 宁明县| 中宁县| 黄梅县| 宣威市| 哈密市| 陈巴尔虎旗| 洪泽县| 平果县| 集贤县| 万盛区| 巩留县| 育儿| 错那县| 湟中县|