公用表表示式

2022-03-06 19:19:16 字數 2764 閱讀 3670

公用表表示式(common table expressions)

--

------假設我們有乙個100w條資料的訂單表,需要分頁查詢。

declare

@rownumber

asint, @pagenumber

asint

set@rownumber=5

set@pagenumber=2

;with orderedorders as

(

select row_number() over(order

by orderdate) as

rownumber

*from

sales.salesorderheader

)select

*from orderorders where

rownumber beteewn ((

@pagenumber

-1)*

@rownumber)+

1)and (@pagenumber

*@rownumber)

在這裡,我們是把已經每列都生成了標識後的資料,放入了cte中,以充當下面的select 語句的一部分(資料來源)。

這是cte的基本語法

expression_name:公共表表示式的名字

[(column_name[,…n])]:這個是查詢字段列表,需要查詢的字段。(當要查詢的字段匹配資料來源中所有的列時,這個列表可以省略,預設查詢全部列)

(cte_query_definition):我們要查詢的sql語句

使用公共表表示式遞迴查詢(recursive queries using common table expressions)

如果你認為cte只有簡簡單單的臨時表功能的話,那你就太小看它了。它其實還有乙個非常實用、非常有意義的功能。遞迴函式,大家應該了解過。就是根據某個條件來判斷,進行自我呼叫。使用recursive cte(遞迴公共表表示式)進行查詢,與一般的遞迴函式原理是一樣的。說白了,就是cte引用cte查詢到的結果。上例子吧:

這段**的作用,是要查詢出員工資訊。資訊包括,員工的上級領導編號,員工自身編號,員工職位,員工所在部門編號、員工等級。研究一下這段**:

我們把這段**分為四部分,第一部分anchor member definition,第二部分recursive member definition,第三部分statement that executes the cte.

anchor member definition:不知道應該怎樣翻譯它,它的作用就像是乙個呼叫函式,它觸發遞迴查詢。

recursive member definition:它的作用就像是乙個遞迴函式,在這裡,我們把anchor member definition查詢到的結果當作引數 ,來查詢recursive member definition.將recursive member definition查詢到的結果當作引數,繼續查詢recursive member definition,直道沒有結果返回。

statement  that executes the cte: 外部呼叫cte的語句。

我們一步一步來執行一下這段**: anchor member definition,會查詢出來等級最高的員工,他沒有上級領導。結果如下:

recursive member definition 通過 anchor member definition返回的結果作為引數,根據e.managerid=d.employee條件來查詢。因為anchor member definition返回的結果是employeeid為1,所以recursive member definition 會去查詢mananger=1的資料。得到的結果如下:

接著,會拿這個結果當作引數,繼續查詢。這次回去查詢manager=273的資料,得到結果如下圖:

繼續拿這個結果作引數,繼續查詢。這次會去查詢manager in (16,274,285)的資料,得到結果如下:

我們執行查詢cte 會得到如下結果:

上圖畫紅線的資料,是anchor member definition 的資料,我們通過union all 將它與recursive member definition 連線。通過這個一步步查詢,我們可以發現,anchor member definition 只是提夠了一次資料,recursive member definition是遞迴執行者。

recursive cte,也可以起到優化語句的效果。我們完全可以通過遞迴查詢,把那些不得不執行多次的相同語句,簡化成一條遞迴查詢即可。

公用表表示式CTE

公用表表示式cte表面上和派生表非常相似,看起來只是語義上的區別。但和派生表比較起來,cte具有幾個優勢 第一,如果須要在乙個cte中引用另乙個cte,不需要像派生表那樣巢狀,相反,只要簡單地在同乙個with子句中定義多個cte,並用逗號把它們分隔開。每個cte可以引用在它前面定義的所有cte。而外...

公用表表示式 CTE

在編寫t sql 時,往往需要臨時儲存某些結果集。前面我們已經廣泛使用和介紹了兩種臨時儲存結果集的方法 臨時表和表變數。除此之外,還可以使用公用表表示式的方法。公用表表示式 common table expression 是sql server2005版本的引入的乙個特性。cte可以看組是乙個臨時的...

公用表表示式 CTE

在編寫t sql 時,往往需要臨時儲存某些結果集。前面我們已經廣泛使用和介紹了兩種臨時儲存結果集的方法 臨時表和表變數。除此之外,還可以使用公用表表示式的方法。公用表表示式 common table expression 是sql server2005版本的引入的乙個特性。cte可以看組是乙個臨時的...