国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

公用表表達式

2024-07-21 02:48:03
字體:
來源:轉載
供稿:網友
公用表表達式

大家好,今天我們來學習一下公用表表達式。在項目中需要編寫SQL語句,因為自己本身對SQL Server知之甚少,一些較復雜的SQL語句,我是寫不出來的。于是,請教我的一位好朋友,數據庫MVP。他給我發來了一段SQL語句,相當好用。在佩服他的SQL語句時,我發現了公用表表達式這個概念,于是就Bing了一篇文章,用心研究了一番。在這里與大家分享一下我的學習心得。

公用表表達式(Common Table ExPRessions)

CTE(公用表表達式)的作用類似于我們的臨時表,就是可以作為SELECT、CREATE、UPDATE等語句中的一部分。它也可以簡化我們的語句,提高數據庫操作性能。就像我上一篇講到的SQL分頁查詢:

--------假設我們有一個100W條數據的訂單表,需要分頁查詢。 DECLARE @RowNumber AS INT, @PageNumber AS INTSET @RowNumber=5SET @PageNumber=2;WITH OrderedOrders AS(      SELECT  ROW_NUMBER() OVER(ORDER BY OrderDate) AS RowNumber        *  FROM Sales.SalesOrderHeader)SELECT * FROM OrderOrders  WHERERowNumber BETEEWN  ((@PageNumber-1)*@RowNumber)+1) AND (@PageNumber*@RowNumber)

在這里,我們是把已經每列都生成了標識后的數據,放入了CTE中,以充當下面的SELECT 語句的一部分(數據源)。

image

這是CTE的基本語法

expression_name:公共表表達式的名字

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

(CTE_query_definition):我們要查詢的SQL語句

使用公共表表達式遞歸查詢(Recursive Queries Using Common Table Expressions)

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

image

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

我們把這段代碼分為四部分,第一部分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,會查詢出來等級最高的員工,他沒有上級領導。結果如下:

image

Recursive member definition 通過 Anchor member definition返回的結果作為參數,根據e.ManagerID=d.Employee條件來查詢。因為Anchor member definition返回的結果是EmployeeID為1,所以Recursive member definition 會去查詢Mananger=1的數據。得到的結果如下:

image

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

image

繼續拿這個結果作參數,繼續查詢。這次會去查詢Manager IN (16,274,285)的數據,得到結果如下:

image

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

image

上圖畫紅線的數據,是Anchor member definition 的數據,我們通過UNION ALL 將它與Recursive member definition 連接。通過這個一步步查詢,我們可以發現,Anchor member definition 只是提夠了一次數據,Recursive member definition是遞歸執行者。

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

原文地址:http://technet.microsoft.com/en-us/library/ms186243(v=SQL.105).aspx


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 合肥市| 罗平县| 卢龙县| 遵化市| 玉林市| 临沭县| 田东县| 陈巴尔虎旗| 体育| 黄骅市| 阆中市| 崇仁县| 成安县| 军事| 永吉县| 五原县| 灵川县| 宁化县| 安吉县| 平舆县| 肥乡县| 昭通市| 垫江县| 石台县| 武汉市| 凤阳县| 清新县| 新疆| 博罗县| 裕民县| 肇州县| 申扎县| 杭锦后旗| 老河口市| 富锦市| 金乡县| 新野县| 龙泉市| 峨边| 郧西县| 紫阳县|