Sub_queries T-SQL中不允许递归引用

时间:2014-03-24 07:52:20

标签: sql sql-server recursion common-table-expression

我有一个像这样的CTE查询:

declare @stop datetime
set @stop='2014-12-12 00:00:00.000'

declare @start datetime
set @start='2011-12-12 00:00:00.000'

declare @temp datetime
set @temp=@start


with X(A,B) AS(
     select @Temp as A,count(*) as B
          from Table1
               where left(convert(varchar,Table1Row1,120),4)=left(convert(varchar,@Temp,120),4)
      union all select dateadd(year,1,(select X.A from X)) as A,count(*) as B
          from Table1
               where left(convert(varchar,Table1Row1,120),4)=left(convert(varchar,(select X.A from X),120),4)
               and datediff(YYYY,(select X.A from X),@stop)>0)
      select A,B into #TempTbl1 from X option(maxrecursion 32767);

我试图从@start到@stop获取每年的行数。该查询接受select语句中X的选择X.A,但不接受where子句。

我收到编译时错误说明:公共表表达式的递归成员' X'有多个递归引用。

执行时,我在子查询中不允许出现错误递归引用。但是,我刚刚在select查询中引用它,它没有显示任何错误。是否存在语法问题,或者我不允许在那里引用该表?

2 个答案:

答案 0 :(得分:1)

select dateadd(year,1,(select X.A from X)) as A,count(*) as B
          from Table1
               where left(convert(varchar,Table1Row1,120),4)=left(convert(varchar,(select X.A from X),120),4)
               and datediff(YYYY,(select X.A from X),@stop)>0

在查询中选择X三次。尝试从Table1和X而不是3个子查询进行连接。

此外,我认为此查询可以更轻松地完成。 类似的东西:

SELECT DATEPART(year, datecolumn), COUNT(pk)
FROM Table1
WHERE datecolumn between @startdate AND @enddate
GROUP BY DATEPART(year, datecolumn)

答案 1 :(得分:0)

正如我的评论中所述,我没有看到与日期范围和Table1的关系。我会假设某种datedatetime列。

如果您的表有要使用的列,则只需执行以下查询即可。

select DatePart (year,Table1DateTimeColumn) as Year,
        count (*) as Cnt
  from Table1
 where Table1DateTimeColumn between @Start and @Stop
 group by DatePart (year,Table1DateTimeColumn)