【IT168技术】 对于SELECT查询语句来说,通常情况下,为了使T-SQL代码更加简洁和可读,在一个查询中引用另外的结果集都是通过视图而不是子查询来进行分解的.但是,视图是作为系统对象存在数据库中,那对于结果集仅仅需要在存储过程或是用户自定义函数中使用一次的时候,使用视图就显得有些奢侈了.
公用表表达式(Common Table Expression)是SQL SERVER 2005版本之后引入的一个特性.CTE可以看作是一个临时的结果集,可以在接下来的一个SELECT,INSERT,UPDATE,DELETE,MERGE语句中被多次引用。使用公用表达式可以让语句更加清晰简练.
除此之外,根据微软对CTE好处的描述,可以归结为四点:
①可以定义递归公用表表达式(CTE)
②当不需要将结果集作为视图被多个地方引用时,CTE可以使其更加简洁
③GROUP BY语句可以直接作用于子查询所得的标量列
④可以在一个语句中多次引用公用表表达式(CTE)
公用表表达式(CTE)的定义
公用表达式的定义非常简单,只包含三部分:公用表表达式的名字(在WITH之后)、所涉及的列名(可选)和一个SELECT语句(紧跟AS之后)。
在MSDN中的原型:
WITH expression_name [ ( column_name [,...n] ) ]
AS
( CTE_query_definition )
AS
( CTE_query_definition )
按照是否递归,可以将公用表(CTE)表达式分为递归公用表表达式和非递归公用表表达式.
非递归公用表表达式(CTE)
非递归公用表表达式(CTE)是查询结果仅仅一次性返回一个结果集用于外部查询调用。并不在其定义的语句中调用其自身的CTE
非递归公用表表达式(CTE)的使用方式和视图以及子查询一致
比如一个简单的非递归公用表表达式:
当然,公用表表达式的好处之一是可以在接下来一条语句中多次引用: