SQL SERVER 2005 CTE(通用表達式)

SQL Server2005數據庫查詢中使用CTE

 

    Builder.com.cn

    

    通用表表達式(CTEs)是SQLServer2005的一項新功能。它們相似於alias(如在SELECTT1.*FROMMyTableT1中),不過功能更爲強大。本質上,CTE是一個臨時結果集,它僅僅存在於它發生的語句中。您能夠在SELECT、INSERT、DELETE、UPDATE或CTEATEVIEW語句中創建一個CTE。CTE相似於派生表,但擁有幾項優勢。

    CTE的優勢

    與派生表不一樣,CTE可以引用本身自己。若是您沒必要存儲視圖,您能夠用一個CTE來代替它。在一個語句中,您還能夠屢次引用CTE。應用CTE,您能夠經過一個派生欄對結果進行分組。

    以前,我曾寫過有關原子和分子查詢的文章。原子查詢創建一個表,而分子查詢創建在原子查詢之上,提供清晰與重複利用。應用CTE也能夠達到一樣的目的。您能夠將查詢區域分割成可讀的「塊」,而後用這些塊創建一個複雜的查詢。執行遞歸查詢是CTE最重要也是最強大的功能。

    創建CTE

    CTE經過關鍵字WITH創建,其模板爲:

    WITHCTE_name[(column_name[,...n])]AS(CTE_query_specification)

    若是在CTE定義中提到的欄名稱是惟一的,那麼您能夠沒必要給它們命名。不過,您一樣也能夠對它們從新命名。

    下面的例子應用到SQLServer2005中的AdventureWorks樣本數據庫。這個數據庫被高度規格化,所以須要幾個鏈接來集合與僱員有關的信息。視圖簡化了這一操做,但也收集了全部有關僱員的信息,而您可能僅僅須要其中一部分資料。

    AdventureWorks的僱員數據分佈在幾個表中;並且,僱員與經理被存儲在同一個表中(HumanResources.Employee),而他們的姓名(及其它數據)則存儲在Person.Contact表中,這使得這個問題更加複雜。

    首先,咱們創建一個恢復僱員姓名的CTE。

    WITHcte_EmployeeAS(SELECTe.EmployeeID,c.FirstName,c.MiddleName,c.LastName,e.TitleASJobTitle,c.Phone,e.ManagerIDFROMHumanResources.EmployeeASeINNERJOINPerson.ContactAScONc.ContactID=e.ContactID)

    而後,咱們可從CTE中選擇一欄或幾欄,就像它是一個標準的表或視圖。

    接着咱們再進一步。咱們須要僱員和他們經理的姓名,因而咱們使用CTE兩次,把它自身鏈接起來。下面是完整的查詢代碼:

    WITHcte_EmployeeAS(SELECTe.EmployeeID,c.FirstName,c.MiddleName,c.LastName,e.TitleASJobTitle,c.Phone,e.ManagerIDFROMHumanResources.EmployeeASeINNERJOINPerson.ContactAScONc.ContactID=e.ContactID)SELECTE.FirstName+''E.LastNameEmployee,M.FirstName+''M.LastNameManagerFROMcte_EmployeeASELEFTOUTERJOINcte_EmployeeASMONE.ManagerID=M.EmployeeID

    限制:不能在一個語句中創建兩個CTE。

    總結

    CTE是SQLServer2005的一項強大而靈活的功能。它使得SQLServer的可讀性更強,更易於管理,下降了查詢的複雜程度。如上所述,您能夠在一個SQLServer語句中屢次應用CTE。

轉載自:http://www.yixia.net/2/172366.htmlhtml

相關文章
相關標籤/搜索