<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          SQL中的遞歸查詢

          共 2268字,需瀏覽 5分鐘

           ·

          2022-07-31 09:32

          遞歸查詢原理

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


          遞歸查詢的終止條件

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


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

          效率高,大量數(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ù),有一個員工表Company,父級ID是部門ID的父節(jié)點,這是一個非常簡單的層次結構模型。

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


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

          查詢每個部門的的直接上級ID


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

          SELECT 部門ID,父級ID,部門名稱,父級部門名稱
          FROM CTE


          結果如下:

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

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

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

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

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


          查詢路徑

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


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

          SELECT 部門ID,父級ID,部門名稱,部門路徑
          FROM CTE



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


          以上就是遞歸查詢的一些知識介紹了,自己可以動手實驗一下,這個一般在面試中也經常會考察面試者,希望能幫助到大家~


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


          有需要的讀者可以下載學習,在下面的公眾號「數(shù)據(jù)前線」(非本號)后臺回復關鍵字:SQL,就行

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


          后臺回復關鍵字:1024,獲取一份精心整理的技術干貨

          后臺回復關鍵字:進群,帶你進入高手如云的交流群。


          推薦閱讀

          瀏覽 73
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  大香蕉伊人在线观看视频 | 在线观看黄A片免费网站 | 天天干少妇| 日本黄色电影网站 | 精品九九九九九九九九九九九 |