SQL Server中双层CTE无法运行报错,求解决方法
解决SQL Server双层CTE的语法错误问题
问题根源
SQL Server不支持嵌套定义CTE(即在一个WITH块内部再嵌套另一个WITH),但MySQL允许这种写法。你遇到的报错就是因为违反了SQL Server的CTE语法规则。
修正后的代码
;WITH t1 AS ( SELECT YEAR(orderdate) AS [year], DATENAME(mm, orderdate) AS [month], soh.TerritoryID, MONTH(orderdate) AS month_num, SUM(totaldue) AS TotalAmount FROM Sales.SalesOrderHeader soh GROUP BY YEAR(orderdate), DATENAME(mm, orderdate), MONTH(orderdate), soh.TerritoryID ), t2 AS ( SELECT t1.year, t1.month, CONCAT(st.Name, ' ', st.CountryRegionCode) AS Region, t1.TotalAmount, t1.month_num -- 保留排序字段到t2中 FROM t1 JOIN Sales.SalesTerritory st ON t1.TerritoryID = st.TerritoryID ) SELECT year, month, Region, TotalAmount FROM t2 ORDER BY year, month_num, TotalAmount DESC;
关键修正点
- 合并CTE定义:将
t1和t2放在同一个WITH子句下,用逗号分隔,彻底移除嵌套的WITH结构 - 调整排序位置:把原
t2中的ORDER BY移到最终查询语句中——SQL Server里CTE中的ORDER BY如果没有搭配TOP/OFFSET FETCH等限制条件,不会实际生效,只是语法允许而已 - 开头分号:保留开头的分号是为了避免前面有未终止的SQL语句干扰,这是SQL Server的语法要求
语法差异说明
MySQL支持嵌套CTE的写法,但SQL Server的CTE规则要求所有公用表表达式必须在同一个WITH块中声明,不允许嵌套定义,这是两者的核心语法差异。
内容的提问来源于stack exchange,提问作者beridzeg45
相关产品推荐
相关产品推荐

