可以将公用表表达式(CTE)视为在单个SELECT,INSERT,UPDATE,DELETE或CREATE VIEW语句的执行范围内定义的临时结果集。CTE与派生表相似,因为它不存储为对象,并且仅在查询期间持续存在。与派生表不同,CTE可以自我引用,并且可以在同一查询中多次引用。
该R
是结果集(或表),您正在生成的名称。和N
是month
数字。
该CTE特别是递归公用表表达式。从MSDN:
公用表表达式(CTE)提供了能够引用自身的显着优势,从而创建了递归CTE。递归CTE是其中重复执行初始CTE以返回数据子集直到获得完整结果集的CTE。
使用CTE时,我的建议是对名称进行描述。因此,对于您的示例,您可以使用以下代码:
;WITH months(MonthNumber) AS
(
SELECT 0
UNION ALL
SELECT MonthNumber+1
FROM months
WHERE MonthNumber < 12
)
select *
from months;
在我的版本中,months
是您正在生成的结果集的名称,并且monthnumber
是值。这将产生一个0到12之间的月份编号列表(请参阅Demo)。
结果:
| MONTHNUMBER |
---------------
| 0 |
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
| 10 |
| 11 |
| 12 |
然后SELECT
紧随其后的语句使用CTE结果集的值来获取月份名称。
;WITH months(MonthNumber) AS
(
SELECT 0
UNION ALL
SELECT MonthNumber+1
FROM months
WHERE MonthNumber < 12
)
SELECT LEFT(DATENAME(MONTH,DATEADD(MONTH,-MonthNumber,GETDATE())),3) AS [month]
FROM months;