公共表表达式(CTE)和视图或衍生查询相似,允许创建一个临时的查询,该查询能在SELECT、INSERT、 UPDATE或DELETE查询范围中引用。和衍生查询不同,不需要在每次使用CTE的时候复制查询定义多次。同时也能在CTE定义中使用局部变量——这是在视图定义中所不能做到的。CTE的基本语法是:
WITH expression_name[(column_name)[,...n]]
AS (CTE_query_definition)
参数 | 描述 |
expression_name | 公共表表达式的名字 |
(column_name)[,...n] | 表达式的唯一列名 |
CTE_query_definition | 定义公共表表达式的SELECT查询 |
非递归的CTE在查询中不引用自己。它就像查询的临时结果集。递归的CTE的定义和非递归的CTE差不多,只是递归的CTE返回层次化的以及和自身相关的数据.和其他方式相比,使用CTE来表示递归数据能尽量减少需要的代码量。
接下来的两个技巧会演示非递归的和递归的CTE.
1.使用非递归的公共表表达式
这个公共表表达式的示例演示返回 Purchasing. Vendor表中的供应商——返回根据名字排序的前5个和最后5个结果:
use AdventureWorks
go
WITH VendorSearch(RowNumber,VendorName,AccountNumber)
AS(
SELECT ROW_NUMBER() OVER (ORDER BY Na