sql - SQL Server - CTE 内的 CTE
问题描述
我有这个查询:
WITH months(dt) AS
(SELECT DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, -1) AS dt
UNION ALL
SELECT dateadd(month, -1, dt)
FROM months)
SELECT
top (datediff(month, '2020-01-01', DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, -1)) + 1)
YEAR(months.dt) yr, MONTH(months.dt) mnth
FROM months
OPTION (maxrecursion 0);
我需要的是最后一个 Select 结果是一个 CTE 表达式,所以我可以在其他选择上使用它。
我试过这个:
WITH months(dt) AS
(SELECT DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, -1) AS dt
UNION ALL
SELECT dateadd(month, -1, dt)
FROM months),
cte2 as (
SELECT
top (datediff(month, '2020-01-01', DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, -1)) + 1)
YEAR(months.dt) yr, MONTH(months.dt) mnth
FROM months
OPTION (maxrecursion 0)
)
但我得到一个错误,我肯定做错了什么。
有什么建议吗?
解决方案
您快到了。您需要添加最后SELECT
的 over cte2
。例如:
WITH
months (dt) AS
(SELECT DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, -1) AS dt
UNION ALL
SELECT dateadd(month, -1, dt)
FROM months),
cte2 as (
SELECT
top (datediff(month, '2020-01-01',
DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, -1)) + 1)
YEAR(months.dt) yr, MONTH(months.dt) mnth
FROM months
)
SELECT * from cte2
OPTION (maxrecursion 0)
这样,您可以一个接一个地链接两个、三个、四个等 CTE。任何 CTE 都可以加入、使用或组合之前定义的任何 CTE。
推荐阅读
- plugins - 我无法为定制制作配方的结果附魔
- visual-studio - 如何防止我的申请被暂停
- apache-spark - 更改 spark shuffle 服务的版本
- faunadb - 如何在 Fauna DB 上高效地查询和过滤?
- c++ - 找到一种在内存(SSL 上下文)中加载多个 ssl 证书(2 RSA)的方法?OpenSSL
- javascript - 如何在每个页面上重用我的 html 导航栏代码
- javascript - 从一页到下一页的背景颜色过渡
- discord - Visual Studio Form 在运行时启动 Rich Discord Presence
- javascript - Firebase 错误数据库未定义新的 firebase 配置
- android - 错误:找不到属性dotsSpacing Android Studio