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

SQL中的遞歸查詢,你會(huì)嗎?

數(shù)據(jù)庫 其他數(shù)據(jù)庫
遞歸查詢沒有顯式的遞歸終止條件,只有當(dāng)?shù)诙€(gè)遞歸查詢返回空結(jié)果集或是超出了遞歸次數(shù)的最大限制時(shí)才停止遞歸。

遞歸查詢?cè)?/h4>

SQL Server中的遞歸查詢是通過CTE(表表達(dá)式)來實(shí)現(xiàn)。至少包含兩個(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。

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

效率高,大量數(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)建測(cè)試數(shù)據(jù),有一個(gè)員工表Company,父級(jí)ID是部門ID的父節(jié)點(diǎn),這是一個(gè)非常簡(jiǎn)單的層次結(jié)構(gòu)模型。

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

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

查詢每個(gè)部門的的直接上級(jí)ID:

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

SELECT 部門ID,父級(jí)ID,部門名稱,父級(jí)部門名稱
FROM CTE

結(jié)果如下:

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

1.查詢父級(jí)ID=-1,作為根節(jié)點(diǎn),這是遞歸查詢的起始點(diǎn)。

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

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

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

查詢路徑

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

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

SELECT 部門ID,父級(jí)ID,部門名稱,部門路徑
FROM CTE

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

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

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

2021-11-29 11:11:45

SQL查詢技巧

2023-08-29 09:46:12

SQLCTE遞歸

2023-12-04 07:09:53

函數(shù)遞歸python

2010-10-11 09:05:40

SQL Server

2011-08-19 14:38:22

SQL Server 2008遞歸查詢

2021-09-13 07:23:52

Go Set 設(shè)計(jì)

2021-04-25 09:42:40

SQL遞歸SQL Server

2022-03-01 07:52:38

鏈表指針節(jié)點(diǎn)

2023-05-05 08:41:16

SQL字符函數(shù)

2019-05-07 15:49:27

AI人工智能藝術(shù)

2010-07-13 10:40:30

唐駿

2021-03-15 06:49:03

Ffmpeg項(xiàng)目轉(zhuǎn)換庫

2021-08-19 15:36:09

數(shù)據(jù)備份存儲(chǔ)備份策略

2024-03-29 12:50:00

項(xiàng)目分層模型

2009-07-20 17:41:59

Java JDBC

2021-04-14 06:53:52

C# 修飾符 Public

2021-04-16 15:02:11

CAP理論分布式

2021-02-15 14:48:31

Hive語法sql

2024-02-22 08:31:26

數(shù)據(jù)恢復(fù)工具MySQL回滾SQL

2012-06-20 10:47:25

Team Leader
點(diǎn)贊
收藏

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