<kbd id="5sdj3"></kbd>
<th id="5sdj3"></th>

  • <dd id="5sdj3"><form id="5sdj3"></form></dd>
    <td id="5sdj3"><form id="5sdj3"><big id="5sdj3"></big></form></td><del id="5sdj3"></del>

  • <dd id="5sdj3"></dd>
    <dfn id="5sdj3"></dfn>
  • <th id="5sdj3"></th>
    <tfoot id="5sdj3"><menuitem id="5sdj3"></menuitem></tfoot>

  • <td id="5sdj3"><form id="5sdj3"><menu id="5sdj3"></menu></form></td>
  • <kbd id="5sdj3"><form id="5sdj3"></form></kbd>

    SQL中的遞歸查詢

    共 2268字,需瀏覽 5分鐘

     ·

    2022-07-31 09:32

    遞歸查詢原理

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


    遞歸查詢的終止條件

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


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

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


    遞歸的常見形式

    WITH CTE AS (

    SELECT column1,column2... FROM tablename WHERE conditions

    UNION ALL

    SELECT column1,column2... FROM tablename 

    INNER JOIN CTE ON conditions 

    )

    遞歸查詢示例

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

    USE SQL_Road
    GO 
    CREATE  TABLE Company
    (
        部門ID INT,
        父級(jí)ID  INT,
        部門名稱 VARCHAR(10)
    )
     INSERT  INTO Company VALUES 
    (1,-1,'總部'),
    (11,1,'財(cái)務(wù)中心'),
    (12,1,'人力中心'),
    (13,1,'信息中心'),
    (111,11,'會(huì)計(jì)組'),
    (112,11,'出納組'),
    (121,12,'薪酬組')


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

    查詢每個(gè)部門的的直接上級(jí)ID


    WITH CTE AS(
     SELECT 部門ID,父級(jí)ID,部門名稱,部門名稱 AS 父級(jí)部門名稱
     FROM Company
     WHERE 父級(jí)ID=-1
     UNION ALL
     SELECT c.部門ID,c.父級(jí)ID,c.部門名稱,p.部門名稱 AS 父級(jí)部門名稱
     FROM CTE P
     INNER JOIN Company c ON p.部門ID=c.父級(jí)ID
    )

    SELECT 部門ID,父級(jí)ID,部門名稱,父級(jí)部門名稱
    FROM CTE


    結(jié)果如下:

    我們來解讀一下上面的代碼

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

    2、迭代公式是 UNION ALL 下面的查詢語句。在查詢語句中調(diào)用中CTE,而查詢語句就是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


    查詢路徑

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


    WITH CTE AS(
     SELECT 部門ID,父級(jí)ID,部門名稱,CAST(部門名稱 AS NVARCHAR(MAX)) AS 部門路徑
     FROM Company
     WHERE 父級(jí)ID=-1
     UNION ALL
     SELECT c.部門ID,c.父級(jí)ID,c.部門名稱,p.部門路徑+'->'+c.部門名稱 AS 部門路徑
     FROM CTE P
     INNER JOIN Company c ON p.部門ID=c.父級(jí)ID
    )

    SELECT 部門ID,父級(jí)ID,部門名稱,部門路徑
    FROM CTE



    其中CAST(部門名稱 AS VARCHAR(MAX))是將部門名稱的長度設(shè)置為最大,防止字段過長超出字段長度。具體結(jié)果如下:


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


    我是岳哥,最后給大家分享我寫的SQL兩件套:《SQL基礎(chǔ)知識(shí)第二版》《SQL高級(jí)知識(shí)第二版》的PDF電子版。里面有各個(gè)語法的解釋、大量的實(shí)例講解和批注等等,非常通俗易懂,方便大家跟著一起來實(shí)操。


    有需要的讀者可以下載學(xué)習(xí),在下面的公眾號(hào)「數(shù)據(jù)前線」(非本號(hào))后臺(tái)回復(fù)關(guān)鍵字:SQL,就行

    數(shù)據(jù)前線


    后臺(tái)回復(fù)關(guān)鍵字:1024,獲取一份精心整理的技術(shù)干貨

    后臺(tái)回復(fù)關(guān)鍵字:進(jìn)群,帶你進(jìn)入高手如云的交流群。


    推薦閱讀

    瀏覽 73
    點(diǎn)贊
    評論
    收藏
    分享

    手機(jī)掃一掃分享

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

    手機(jī)掃一掃分享

    分享
    舉報(bào)

    <kbd id="5sdj3"></kbd>
    <th id="5sdj3"></th>

  • <dd id="5sdj3"><form id="5sdj3"></form></dd>
    <td id="5sdj3"><form id="5sdj3"><big id="5sdj3"></big></form></td><del id="5sdj3"></del>

  • <dd id="5sdj3"></dd>
    <dfn id="5sdj3"></dfn>
  • <th id="5sdj3"></th>
    <tfoot id="5sdj3"><menuitem id="5sdj3"></menuitem></tfoot>

  • <td id="5sdj3"><form id="5sdj3"><menu id="5sdj3"></menu></form></td>
  • <kbd id="5sdj3"><form id="5sdj3"></form></kbd>
    中文字幕在线第一页 | 精品无码一区二区三区的天堂 | 狠狠穞A片一區二區三區 | 国产黄色A片香蕉网 | 国产色天使 |