使用SqlServer CTE遞歸查詢處理樹、圖和層次結(jié)構(gòu)
CTE(Common Table Expressions)是從SQL Server 2005以后版本才有的。指定的臨時(shí)命名結(jié)果集,這些結(jié)果集稱為CTE。 與派生表類似,不存儲(chǔ)為對(duì)象,并且只在查詢期間有效。與派生表的不同之處在于,CTE 可自引用,還可在同一查詢中引用多次。使用CTE能改善代碼可讀性,且不損害其性能。
遞歸CTE是SQL SERVER 2005中重要的增強(qiáng)之一。一般我們?cè)谔幚順?,圖和層次結(jié)構(gòu)的問題時(shí)需要用到遞歸查詢。
CTE的語(yǔ)法如下
WITH CTE AS ( SELECT EmpId, ReportTo, FName FROM Employ WHERE EmpId= UNION ALL SELECT emp.EmpId, emp.ReportTo, emp.FName FROM CTE JOIN Employ as emp ON CTE.EmpId=emp.ReportTo )
遞歸CTE最少包含兩個(gè)查詢(也被稱為成員)。第一個(gè)查詢?yōu)槎c(diǎn)成員,定點(diǎn)成員只是一個(gè)返回有效表的查詢,用于遞歸的基礎(chǔ)或定位點(diǎn)。第二個(gè)查詢被稱為遞歸成員,使該查詢稱為遞歸成員的是對(duì)CTE名稱的遞歸引用是觸發(fā)。在邏輯上可以將CTE名稱的內(nèi)部應(yīng)用理解為前一個(gè)查詢的結(jié)果集。
遞歸查詢沒有顯式的遞歸終止條件,只有當(dāng)?shù)诙€(gè)遞歸查詢返回空結(jié)果集或是超出了遞歸次數(shù)的最大限制時(shí)才停止遞歸。是指遞歸次數(shù)上限的方法是使用MAXRECURION。
USE AdventureWorks; GO --Creates an infinite loop WITH cte (EmployeeID, ManagerID, Title) as ( SELECT EmployeeID, ManagerID, Title FROM HumanResources.Employee WHERE ManagerID IS NOT NULL UNION ALL SELECT cte.EmployeeID, cte.ManagerID, cte.Title FROM cte JOIN HumanResources.Employee AS e ON cte.ManagerID = e.EmployeeID ) --Uses MAXRECURSION to limit the recursive levels to SELECT EmployeeID, ManagerID, Title FROM cte OPTION (MAXRECURSION ); GO
以上內(nèi)容就是本文給大家介紹的使用SqlServer CTE遞歸查詢處理樹、圖和層次結(jié)構(gòu),希望大家喜歡。
- sql server使用公用表表達(dá)式CTE通過遞歸方式編寫通用函數(shù)自動(dòng)生成連續(xù)數(shù)字和日期
- SqlServer使用公用表表達(dá)式(CTE)實(shí)現(xiàn)無(wú)限級(jí)樹形構(gòu)建
- SQL Server 公用表表達(dá)式(CTE)實(shí)現(xiàn)遞歸的方法
- 在sqlserver中如何使用CTE解決復(fù)雜查詢問題
- SQL SERVER 2008 CTE生成結(jié)點(diǎn)的FullPath
- SQLSERVER2008中CTE的Split與CLR的性能比較
- 使用SQLSERVER 2005/2008 遞歸CTE查詢樹型結(jié)構(gòu)的方法
- SQL?Server使用T-SQL進(jìn)階之公用表表達(dá)式(CTE)
相關(guān)文章
SQL Server 總結(jié)復(fù)習(xí) (二)
SQL Server 總結(jié)復(fù)習(xí),學(xué)習(xí)sqlserver的朋友可以參考下2012-08-08深入分析MSSQL數(shù)據(jù)庫(kù)中事務(wù)隔離級(jí)別和鎖機(jī)制
事務(wù)隔離級(jí)別簡(jiǎn)單的說,就是當(dāng)激活事務(wù)時(shí),控制事務(wù)內(nèi)因SQL語(yǔ)句產(chǎn)生的鎖定需要保留多入,影響范圍多大,以防止多人訪問時(shí),在事務(wù)內(nèi)發(fā)生數(shù)據(jù)查詢的錯(cuò)誤。設(shè)置事務(wù)隔離級(jí)別將影響整條連接。2014-08-08快速插入大量數(shù)據(jù)的asp.net代碼(Sqlserver)
目標(biāo)數(shù)據(jù)庫(kù)只能是Sqlserver 來源數(shù)據(jù)庫(kù) 無(wú)所謂 只要能用ado.net 將來源數(shù)據(jù)讀取到Dataset或者Datareader 中就可以了。2011-02-02sum(case when then)(判斷男女生的個(gè)數(shù))
判斷類似一個(gè)班級(jí)的男生和女生的人數(shù)使用sum (cese when then)示例代碼如下,感興趣的朋友可以參考下2013-09-09sql更新語(yǔ)句中update set from用法實(shí)現(xiàn)
本文主要介紹了sql更新語(yǔ)句中update set from用法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02sqlserver中操作主從關(guān)系表的sql語(yǔ)句
在項(xiàng)目開發(fā)中,經(jīng)常出現(xiàn)這樣的需求。在新增或修改一個(gè)主表數(shù)據(jù)時(shí),對(duì)應(yīng)的從表也要進(jìn)行同步,此時(shí)我們是怎么操作的了?2011-07-07詳解安裝sql2012出現(xiàn)錯(cuò)誤could not open key...解決辦法
這篇文章主要介紹了詳解安裝sql2012出現(xiàn)錯(cuò)誤could not open key...解決辦法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11SQLSERVER數(shù)據(jù)庫(kù)中的5173錯(cuò)誤解決方法
修復(fù)因?yàn)榭蛻裟沁呅枰@個(gè)數(shù)據(jù)庫(kù),當(dāng)我附加數(shù)據(jù)庫(kù)的時(shí)候報(bào)錯(cuò),數(shù)據(jù)庫(kù)是SQL2005,接下來將介紹詳細(xì)解決方法2013-03-03