公用表表達式

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

 公用表表達式(Common Table Expressions)express

   CTE(公用表表達式)的做用相似於咱們的臨時表,就是能夠做爲SELECT、CREATE、UPDATE等語句中的一部分。它也能夠簡化咱們的語句,提升數據庫操做性能。就像我上一篇講到的SQL分頁查詢:函數

--------假設咱們有一個100W條數據的訂單表,須要分頁查詢。
 DECLARE @RowNumber AS INT, @PageNumber AS INT
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 語句的一部分(數據源)。性能

image

          這是CTE的基本語法學習

expression_name:公共表表達式的名字優化

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

(CTE_query_definition):咱們要查詢的SQL語句翻譯

 

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

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

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

相關文章
相關標籤/搜索