原 SQL Server中使用CTE遞迴查詢

2022-01-26 13:46:59 字數 3351 閱讀 6920

目錄

背景

問題思路

ctecte遞迴查詢

結束語參考資料

怎麼遍歷出乙個父級選單下所有子選單?

思路

定義語法結構

使用cte準則

示例**

定義

cte(common table expressions)是從sql server 2005以後版本才有的。指定的臨時命名結果集,這些結果集稱為cte。 與派生表類似,不儲存為物件,並且只在查詢期間有效。與派生表的不同之處在於,cte 可自引用,還可在同一查詢中引用多次。使用cte能改善**可讀性,且不損害其效能。

語法結構

cte 的基本語法結構如下:

with expression_name [ ( column_name [,...n] ) ]

as( cte_query_definition )

只有在查詢定義中為所有結果列都提供了不同的名稱時,列名稱列表才是可選的。

執行 cte 的語句為:

select

from expression_name;

使用cte準則建立cte時,需要注意的一些準則,詳見msnd列出的使用準則:

定義cte時最好加字首」;」

cte內部定義的列字段要保持一致

cte with之後第一句必須使用cte的select。即cte的生命週期只是在第一次使用之後就消亡。

sp中只能使用一次with語句。

定義多個cte時,只宣告乙個with關鍵字就行,比如

with test1

as (

select * …………

), test2 as

( select * …………

)

通用表表示式(cte)是sql server的一項新功能。本質上cte是乙個臨時結果集,它僅僅存在於它發生的語句中。可以在select、insert、delete或create view語句中建立乙個cte

示例**

建立測試表

use master

goif exists(select * from sysobjects where name='node')

drop table node

---建立表

create table node

( nid int primary key,

parentid int not null,

name nvarchar(50) not null

)

插入資料

insert into node values

(1,0,'aa'),

(2,1,'bb'),

(3,2,'cc'),

(4,2,'dd'),

(5,3,'ee'),

(6,4,'ff'),

(7,5,'gg'),

(8,4,'hh'),

(9,3,'ii'),

(10,5,'jj');

建立乙個cte的demo

;with nodecte(nid,parentid,name)

as (

select nid,parentid,name from node where name='bb'

union all

select b.nid,b.parentid,b.name from nodecte a ,node b where b.parentid=a.nid

)select * from nodecte;

cte遞迴查詢結構

cte遞迴查詢原理

原節點圖和執行cte結果集

cte遞迴查詢結構(引自msdn)

transact-sql 中的遞迴 cte 的結構與其他程式語言中的遞迴例程相似。儘管其他語言中的遞迴例程返回標量值,但遞迴 cte 可以返回多行。

遞迴 cte 由下列三個元素組成:

例程的呼叫。

遞迴 cte 的第乙個呼叫包括乙個或多個由 union all、union、except 或 intersect 運算子聯接的 cte_query_definitions。由於這些查詢定義形成了 cte 結構的基準結果集,所以它們被稱為「定位點成員」。

cte_query_definitions 被視為定位點成員,除非它們引用了 cte 本身。所有定位點成員查詢定義必須放置在第乙個遞迴成員定義之前,而且必須使用 union all 運算子聯接最後乙個定位點成員和第乙個遞迴成員。

例程的遞迴呼叫。

遞迴呼叫包括乙個或多個由引用 cte 本身的 union all 運算子聯接的 cte_query_definitions。這些查詢定義被稱為「遞迴成員」。

終止檢查。

終止檢查是隱式的;當上乙個呼叫中未返回行時,遞迴將停止。

注意

如果遞迴 cte 組合不正確,可能會導致無限迴圈。例如,如果遞迴成員查詢定義對父列和子列返回相同的值,則會造成無限迴圈。在測試遞迴查詢的結果時,可以通過在 insert、update、delete 或 select 語句的 option 子句中使用 maxrecursion 提示和 0 到 32,767 之間的值,來限制特定語句允許的遞迴級數。

cte遞迴查詢原理將cte表達示拆分為「定位點成員」和「遞迴成員」執行定位點成員,執行建立第乙個結果集t0執行遞迴成員時,將前乙個結果集作為輸入(ti),將ti+1作為輸出

重複第三步,直到返回空集

返回結果集,通過union all合併t0 到 tn的結果

原節點圖和執行cte結果集

cte結果集

SQL Server中使用Check約束提公升效能

在sql server中,sql語句的執行是依賴查詢優化器生成的執行計畫,而執行計畫的好壞直接關乎執行效能。在查詢優化器生成執行計畫過程中,需要參考元資料來盡可能生成高效的執行計畫,因此元資料越多,則執行計畫更可能會高效。所謂需要參考的元資料主要包括 索引 表結構 統計資訊等,但還有一些不是很被注意...

在SQL Server中使用索引的技巧

在sql server中,為了查詢效能的優化,有時我們就需要對資料表通過建立索引的方式,目的主要是根據查詢要求,迅速縮小查詢範圍,避免全表掃瞄。索引有兩種型別,分別是聚集索引 clustered index,也稱聚類索引 簇集索引 和非聚集索引 nonclustered index,也稱非聚類索引 ...

SQL Server 2000 中使用正規表示式

這兩天有個需求,需要在資料庫中判斷字串的格式,於是從網上蒐集了一些資料,整理了一下。下面這個是乙個自定義函式,使用者可以呼叫這個函式判斷指定的字串是否符合正規表示式的規則.create function dbo.find regular expression source varchar 5000 ...