Tsql 嵌套公共表表达式的语法

Tsql 嵌套公共表表达式的语法,tsql,ssms,common-table-expression,Tsql,Ssms,Common Table Expression,昨天我问了一个复杂的问题,有人给了我一个例子。我真的很想让它工作,但有一个语法错误,我不能弄清楚。请记住,我刚在本周早些时候被介绍给CTE,所以希望这是一个简单的介绍 我不认为我需要在这里发布完整的代码,所以我只做总结 with cte as (select dateadd(hour, 1, cast(cast(getdate() -1 as date) as datetime)) as midnnight), allhours as ( select 0 as hour, midnigh

昨天我问了一个复杂的问题,有人给了我一个例子。我真的很想让它工作,但有一个语法错误,我不能弄清楚。请记住,我刚在本周早些时候被介绍给CTE,所以希望这是一个简单的介绍

我不认为我需要在这里发布完整的代码,所以我只做总结

 with cte as (select dateadd(hour, 1, cast(cast(getdate() -1 as date) as datetime)) as midnnight),
 allhours as (
 select 0 as hour, midnight as timestart, dateadd(hour, 1, timestart) as timeend from cte union all
 select 1 as hour, dateadd(hour, 1, midnight), dateadd(hour, 2, midnight) from cte union all
 ....
 select 23 as hour, dateadd(hour, 23, midnight), dateadd(hour, 24, midnight) from cte union all
) 
select ah.hour,...
(…)表示不必要的代码,我省略了这些代码以使其不那么凌乱

但是我在select 23和select ah.hour之间的括号中得到了一个语法错误 “')”附近的语法不正确。应为SELECT或“(”

非常感谢您的帮助


-J

您有一些语法错误,包括底部不需要的
UNION ALL
,并且
allhours
中的第一个
SELECT
引用了一个别名,请尝试以下操作:

;with cte as 
(
  select dateadd(hour, 1, cast(cast(getdate() -1 as date) as datetime)) as midnight
),
allhours as 
(
  select 0 as hour, midnight as timestart, dateadd(hour, 1, midnight) as timeend 
  from cte 
  union all
  select 1 as hour, dateadd(hour, 1, midnight), dateadd(hour, 2, midnight) 
  from cte 
  union all
  select 23 as hour, dateadd(hour, 23, midnight), dateadd(hour, 24, midnight) 
  from cte
) 
select *
from allhours

请参见这里的您应该去掉最后一个
Union all

 hour, dateadd(hour, 23, midnight), dateadd(hour, 24, midnight) from cte union all 
)  
select ah.hour,... 

另外,在第一行拼写midnight(午夜)

非常感谢波迪卢斯卡!我认为@bluefeet的答案更完整-你应该接受这个答案:)我也会投票支持你的答案,@Podi卢斯卡,但我还没有必要的声誉。对不起:/谢谢bluefeet,这帮了大忙!