1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        詳解SQL中的遞歸問(wèn)題

        共 2656字,需瀏覽 6分鐘

         ·

        2021-04-29 05:30

        SQL專欄

        40000字筆記!HiveSQL再不懂來(lái)找我!

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

        SQL Server中的遞歸查詢是通過(guò)CTE(表表達(dá)式)來(lái)實(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é)果集。


        遞歸查詢的終止條件

        遞歸查詢沒(méi)有顯式的遞歸終止條件,只有當(dāng)?shù)诙€(gè)遞歸查詢返回空結(jié)果集或是超出了遞歸次數(shù)的最大限制時(shí)才停止遞歸。是指遞歸次數(shù)上限的方法是使用MAXRECURION。


        遞歸查詢的優(yōu)點(diǎn)

        效率高,大量數(shù)據(jù)集下,速度比程序的查詢快。


        遞歸的常見(jiàn)形式

        WITH CTE AS (

        SELECT column1,column2... FROM tablename WHERE conditions

        UNION ALL

        SELECT column1,column2... FROM tablename 

        INNER JOIN CTE ON conditions 

        )

        遞歸查詢示例

        創(chuàng)建測(cè)試數(shù)據(jù),有一個(gè)員工表Employee,ManagerID是UserID的父節(jié)點(diǎn),這是一個(gè)非常簡(jiǎn)單的層次結(jié)構(gòu)模型。

        USE SQL_Road
        GO 
        CREATE  TABLE Employee
        (
            UserID INT,
            ManagerID INT,
            Name NVARCHAR(10)
        )
         INSERT  INTO dbo.Employee
         SELECT 1,-1,N'Boss'
         UNION  ALL
         SELECT 11,1,N'A1'
         UNION  ALL
         SELECT 12,1,N'A2'
         UNION  ALL
         SELECT 13,1,N'A3'
         UNION  ALL
         SELECT 111,11,N'B1'
         UNION  ALL
         SELECT 112,11,N'B2'
         UNION  ALL
         SELECT 121,12,N'C1'


        查詢一下Employee表里的數(shù)據(jù)

        查詢每個(gè)User的的直接上級(jí)Manager

        WITH CTE AS(
         SELECT UserID,ManagerID,Name,Name AS ManagerName
         FROM dbo.Employee
         WHERE ManagerID=-1
         UNION ALL
         SELECT c.UserID,c.ManagerID,c.Name,p.Name AS ManagerName
         FROM CTE P
         INNER JOIN dbo.Employee c ON p.UserID=c.ManagerID
        )

        SELECT UserID,ManagerID,Name,ManagerName
        FROM CTE


        結(jié)果如下:

        我們來(lái)解讀一下上面的代碼

        1、查詢ManagerID=-1,作為根節(jié)點(diǎn),這是遞歸查詢的起始點(diǎn)。

        2、迭代公式是 UNION ALL 下面的查詢語(yǔ)句。在查詢語(yǔ)句中調(diào)用中CTE,而查詢語(yǔ)句就是CTE的組成部分,即 “自己調(diào)用自己”,這就是遞歸的真諦所在。

        所謂迭代,是指每一次遞歸都要調(diào)用上一次查詢的結(jié)果集,UNION ALL是指每次都把結(jié)果集并在一起。

        3、迭代公式利用上一次查詢返回的結(jié)果集執(zhí)行特定的查詢,直到CTE返回NULL或達(dá)到最大的迭代次數(shù),默認(rèn)值是32。最終的結(jié)果集是迭代公式返回的各個(gè)結(jié)果集的并集,求并集是由UNION ALL 子句定義的,并且只能使用UNION ALL


        查詢路徑

        下面我們通過(guò)層次結(jié)構(gòu)查詢子節(jié)點(diǎn)到父節(jié)點(diǎn)的PATH,我們對(duì)上面的代碼稍作修改:

        WITH CTE AS(
         SELECT UserID,ManagerID,Name,CAST(Name AS NVARCHAR(MAX)) AS LPath
         FROM dbo.Employee
         WHERE ManagerID=-1
         UNION ALL
         SELECT c.UserID,c.ManagerID,c.Name,p.LPath+'->'+c.Name AS LPath
         FROM CTE P
         INNER JOIN dbo.Employee c ON p.UserID=c.ManagerID
         )

        SELECT UserID,ManagerID,Name,LPath
        FROM CTE


        其中CAST(Name AS NVARCHAR(MAX))是將Name的長(zhǎng)度設(shè)置為最大,防止字段過(guò)長(zhǎng)超出字段長(zhǎng)度。具體結(jié)果如下:


        以上就是遞歸查詢的一些知識(shí)介紹了,自己可以動(dòng)手實(shí)驗(yàn)一下,這個(gè)一般在面試中也經(jīng)常會(huì)考察面試者,希望能幫助到大家~

        ·················END·················

        推薦閱讀

        1. 超細(xì)節(jié)!數(shù)據(jù)分析社招面試指南

        2. 寫(xiě)給所有數(shù)據(jù)人。

        3. 從留存率業(yè)務(wù)案例談0-1的數(shù)據(jù)指標(biāo)體系

        4. 數(shù)據(jù)分析師的一周

        5. 超級(jí)菜鳥(niǎo)如何入門(mén)數(shù)據(jù)分析?


        歡迎長(zhǎng)按掃碼關(guān)注「數(shù)據(jù)管道」

        瀏覽 62
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            91色视频 | 国产精品亚洲无码 | 91久久精品一区二区 | 天天操天天操天天干 | 国产精品久久久久久久久久久久久免费看 | 性玩具椅羞耻play调教流白浆 | 男男惩罚往屁股眼里夹姜 | 日韩国产片 | 少妇下蹲露大唇无遮挡 | 色欲AV成人|