這篇文章主要介紹“SQL中的遞歸原理”,在日常操作中,相信很多人在SQL中的遞歸原理問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”SQL中的遞歸原理”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!
站在用戶(hù)的角度思考問(wèn)題,與客戶(hù)深入溝通,找到川匯網(wǎng)站設(shè)計(jì)與川匯網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶(hù)體驗(yàn)好的作品,建站類(lèi)型包括:成都做網(wǎng)站、網(wǎng)站建設(shè)、外貿(mào)營(yíng)銷(xiāo)網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、主機(jī)域名、網(wǎng)站空間、企業(yè)郵箱。業(yè)務(wù)覆蓋川匯地區(qū)。
SQL Server中的遞歸查詢(xún)是通過(guò)CTE(表表達(dá)式)來(lái)實(shí)現(xiàn)。至少包含兩個(gè)查詢(xún),第一個(gè)查詢(xún)?yōu)槎c(diǎn)成員,定點(diǎn)成員只是一個(gè)返回有效表的查詢(xún),用于遞歸的基礎(chǔ)或定位點(diǎn);第二個(gè)查詢(xún)被稱(chēng)為遞歸成員,使該查詢(xún)稱(chēng)為遞歸成員的是對(duì)CTE名稱(chēng)的遞歸引用是觸發(fā)。在邏輯上可以將CTE名稱(chēng)的內(nèi)部應(yīng)用理解為前一個(gè)查詢(xún)的結(jié)果集。
遞歸查詢(xún)沒(méi)有顯式的遞歸終止條件,只有當(dāng)?shù)诙€(gè)遞歸查詢(xún)返回空結(jié)果集或是超出了遞歸次數(shù)的最大限制時(shí)才停止遞歸。是指遞歸次數(shù)上限的方法是使用MAXRECURION。
效率高,大量數(shù)據(jù)集下,速度比程序的查詢(xú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'
查詢(xún)一下Employee表里的數(shù)據(jù)
查詢(xún)每個(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、查詢(xún)ManagerID=-1,作為根節(jié)點(diǎn),這是遞歸查詢(xún)的起始點(diǎn)。
2、迭代公式是 UNION ALL 下面的查詢(xún)語(yǔ)句。在查詢(xún)語(yǔ)句中調(diào)用中CTE,而查詢(xún)語(yǔ)句就是CTE的組成部分,即 “自己調(diào)用自己”,這就是遞歸的真諦所在。
所謂迭代,是指每一次遞歸都要調(diào)用上一次查詢(xún)的結(jié)果集,UNION ALL是指每次都把結(jié)果集并在一起。
3、迭代公式利用上一次查詢(xún)返回的結(jié)果集執(zhí)行特定的查詢(xún),直到CTE返回NULL或達(dá)到最大的迭代次數(shù),默認(rèn)值是32。最終的結(jié)果集是迭代公式返回的各個(gè)結(jié)果集的并集,求并集是由UNION ALL 子句定義的,并且只能使用UNION ALL
下面我們通過(guò)層次結(jié)構(gòu)查詢(xún)子節(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é)果如下:
到此,關(guān)于“SQL中的遞歸原理”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!
本文名稱(chēng):SQL中的遞歸原理
網(wǎng)頁(yè)路徑:http://vcdvsql.cn/article48/pejehp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營(yíng)銷(xiāo)推廣、外貿(mào)建站、網(wǎng)站改版、軟件開(kāi)發(fā)、網(wǎng)站收錄、用戶(hù)體驗(yàn)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)