自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

詳解SQL中的遞歸問題

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

[[395526]]

遞歸查詢原理

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

遞歸查詢的終止條件

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

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

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

遞歸的常見形式

  1. WITH CTE AS ( 
  2. SELECT column1,column2... FROM tablename WHERE conditions 
  3. UNION ALL 
  4. SELECT column1,column2... FROM tablename  
  5. INNER JOIN CTE ON conditions  

遞歸查詢示例

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

  1. USE SQL_Road 
  2. GO  
  3. CREATE  TABLE Employee 
  4.     UserID INT
  5.     ManagerID INT
  6.     Name NVARCHAR(10) 
  7.  INSERT  INTO dbo.Employee 
  8.  SELECT 1,-1,N'Boss' 
  9.  UNION  ALL 
  10.  SELECT 11,1,N'A1' 
  11.  UNION  ALL 
  12.  SELECT 12,1,N'A2' 
  13.  UNION  ALL 
  14.  SELECT 13,1,N'A3' 
  15.  UNION  ALL 
  16.  SELECT 111,11,N'B1' 
  17.  UNION  ALL 
  18.  SELECT 112,11,N'B2' 
  19.  UNION  ALL 
  20.  SELECT 121,12,N'C1' 

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

查詢每個User的的直接上級Manager

  1. WITH CTE AS
  2.  SELECT UserID,ManagerID,Name,Name AS ManagerName 
  3.  FROM dbo.Employee 
  4.  WHERE ManagerID=-1 
  5.  UNION ALL 
  6.  SELECT c.UserID,c.ManagerID,c.Name,p.Name AS ManagerName 
  7.  FROM CTE P 
  8.  INNER JOIN dbo.Employee c ON p.UserID=c.ManagerID 
  9.  
  10. SELECT UserID,ManagerID,Name,ManagerName 
  11. FROM CTE 

結(jié)果如下:

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

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

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

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

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

查詢路徑

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

  1. WITH CTE AS
  2.  SELECT UserID,ManagerID,Name,CAST(Name AS NVARCHAR(MAX)) AS LPath  
  3.  FROM dbo.Employee 
  4.  WHERE ManagerID=-1 
  5.  UNION ALL 
  6.  SELECT c.UserID,c.ManagerID,c.Name,p.LPath+'->'+c.Name AS LPath 
  7.  FROM CTE P 
  8.  INNER JOIN dbo.Employee c ON p.UserID=c.ManagerID 
  9.  ) 
  10.  
  11. SELECT UserID,ManagerID,Name,LPath 
  12. FROM CTE 

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

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

 

責任編輯:武曉燕 來源: SQL數(shù)據(jù)庫開發(fā)
相關(guān)推薦

2021-04-09 10:37:40

SQL Server數(shù)據(jù)庫排名

2010-10-11 09:05:40

SQL Server

2023-11-02 08:38:49

遞歸SQL用法

2023-08-29 09:46:12

SQLCTE遞歸

2021-11-03 16:00:40

SQL流量序號

2021-04-06 11:50:30

SQL數(shù)據(jù)統(tǒng)計

2022-03-15 08:36:46

遞歸查詢SQL

2010-05-12 11:14:25

MySQL SQL優(yōu)化

2010-08-05 09:07:24

2010-09-06 14:58:42

SQL函數(shù)

2010-09-07 11:53:00

SQL語句

2021-02-03 09:21:59

SQL機器學習ML

2010-09-09 11:12:49

SQL函數(shù)DATALENGTH

2024-10-17 16:08:36

SQL 查詢SQL

2021-08-12 07:49:24

SQL遞歸用法

2021-11-09 06:55:03

SQLServer排序

2010-09-08 17:15:45

SQL循環(huán)結(jié)構(gòu)

2010-09-08 14:03:41

SQL函數(shù)CONVERT

2011-08-19 14:38:22

SQL Server 2008遞歸查詢

2009-09-02 19:12:37

C#遞歸
點贊
收藏

51CTO技術(shù)棧公眾號