成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一篇學會SQL中的遞歸的用法

運維 數據庫運維
遞歸查詢沒有顯式的遞歸終止條件,只有當第二個遞歸查詢返回空結果集或是超出了遞歸次數的最大限制時才停止遞歸。是指遞歸次數上限的方法是使用MAXRECURION。

[[417059]]

本文轉載自微信公眾號「SQL數據庫開發」,作者丶平凡世界。轉載本文請聯系SQL數據庫開發公眾號。

遞歸查詢原理

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

遞歸查詢的終止條件

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

遞歸查詢的優點

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

遞歸的常見形式

WITH CTE AS (

SELECT column1,column2... FROM tablename WHERE conditions

UNION ALL

SELECT column1,column2... FROM tablename

INNER JOIN CTE ON conditions

)

遞歸查詢示例

創建測試數據,有一個員工表Employee,ManagerID是UserID的父節點,這是一個非常簡單的層次結構模型。

  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表里的數據

查詢每個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 

結果如下:

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

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

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

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

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

查詢路徑

下面我們通過層次結構查詢子節點到父節點的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的長度設置為最大,防止字段過長超出字段長度。具體結果如下:

 

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

 

責任編輯:武曉燕 來源: SQL數據庫開發
相關推薦

2024-05-10 08:15:32

go語言反射機制

2021-08-27 07:47:06

SQL靜態程序

2021-08-01 07:19:16

語言OpenrestyNginx

2022-06-30 22:53:18

數據結構算法

2021-10-26 10:40:26

代理模式虛擬

2021-12-04 22:05:02

Linux

2022-05-17 08:02:55

GoTryLock模式

2022-03-01 08:31:37

volatile變量編譯器

2022-01-02 08:43:46

Python

2022-02-07 11:01:23

ZooKeeper

2022-01-12 07:36:01

Java數據ByteBuffer

2021-12-01 11:33:21

函數Min

2021-12-08 14:02:20

符串排列搜索

2021-05-11 08:54:59

建造者模式設計

2021-07-02 09:45:29

MySQL InnoDB數據

2021-07-06 08:59:18

抽象工廠模式

2023-01-03 08:31:54

Spring讀取器配置

2022-08-26 09:29:01

Kubernetes策略Master

2021-07-05 22:11:38

MySQL體系架構

2023-11-28 08:29:31

Rust內存布局
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91精品国产美女在线观看 | 日韩精品免费视频 | 超碰日本 | 日韩成人一区 | 综合激情av | h视频在线免费 | 99re6在线| 涩涩导航| 天天天久久久 | 成人在线播放 | 久久久99精品免费观看 | 久久久久久久久久久成人 | 伊伊综合网 | 人人天天操 | 狠狠入ady亚洲精品经典电影 | 夜夜久久 | 国产精品a一区二区三区网址 | 亚洲色图综合 | 女人毛片a毛片久久人人 | 性一爱一乱一交一视频 | 久久久久亚洲 | 国产精品7777777 | 在线播放一区二区三区 | 久久国内精品 | 91视频在线观看 | 精品日韩一区 | 色妞av| 久久久精品综合 | 综合色播| 国产激情一区二区三区 | 成人免费视频网站在线看 | 日本一区二区电影 | 看av在线 | 成人免费在线视频 | 成人av免费| 欧美另类视频 | 日韩美av | 超碰人人人人 | 婷婷综合 | 欧美一区二区在线观看 | 中文精品视频 |