簡介
對於SELECT查詢語句來說,通常情況下,為了使T-SQL代碼更加簡潔和可讀,在一個查詢中引用另外的結果集都是通過視圖而不是子查詢來進行分解的.但是,視圖是作為系統對象存在數據庫中,那對於結果集僅僅需要在存儲過程或是用戶自定義函數中使用一次的時候,使用視圖就顯得有些奢侈了.
公用表表達式(Common Table Expression)是SQL SERVER 2005版本之後引入的一個特性.CTE可以看作是一個臨時的結果集,可以在接下來的一個SELECT,INSERT,UPDATE,DELETE,MERGE語句中被多次引用。使用公用表達式可以讓語句更加清晰簡練.
除此之外,根據微軟對CTE好處的描述,可以歸結為四點:
可以定義遞歸公用表表達式(CTE)
當不需要將結果集作為視圖被多個地方引用時,CTE可以使其更加簡潔
GROUP BY語句可以直接作用於子查詢所得的標量列
可以在一個語句中多次引用公用表表達式(CTE)
公用表達式的定義非常簡單,只包含三部分:
公用表表達式的名字(在WITH之後)
所涉及的列名(可選)
一個SELECT語句(緊跟AS之後)
在MSDN中的原型:
WITH expression_name [ ( column_name [,...n] ) ] AS ( CTE_query_definition )
按照是否遞歸,可以將公用表(CTE)表達式分為遞歸公用表表達式和非遞歸公用表表達式.
非遞歸公用表表達式(CTE)是查詢結果僅僅一次性返回一個結果集用於外部查詢調用。並不在其定義的語句中調用其自身的CTE
非遞歸公用表表達式(CTE)的使用方式和視圖以及子查詢一致
比如一個簡單的非遞歸公用表表達式:
當然,公用表表達式的好處之一是可以在接下來一條語句中多次引用: