为什么递归CTE无法使用分组和其他子句?

时间:2010-10-11 03:24:56

标签: sql sql-server tsql sql-server-2005 recursion

我最近了解了递归公用表表达式(CTE),同时寻找构建某些数据的某种视图的方法。在花了一段时间写出我的查询的第一次迭代是如何工作之后,我把它变成了一个CTE来观察整个事情的发展。我很惊讶地看到分组不起作用,所以我只是用“Select TOP 1,ORDER BY”等同替换它。我再次感到惊讶的是,不允许使用“TOP”,并且发现所有这些条款都不允许在CTE的递归部分中使用:

  • DISTINCT
  • GROUP BY
  • HAVING
  • TOP
  • LEFT
  • RIGHT
  • 外部加入

所以我想我有两个问题:

  1. 为了更好地了解我的情况和SQL,为什么不允许这些条款?
  2. 如果我需要使用其中一些子句进行某种递归,那么我是编写递归存储过程的唯一选择吗?
  3. 感谢。

1 个答案:

答案 0 :(得分:2)

参考: -

  
      
  1. 为了更好地了解我的情况和SQL,为什么不允许这些条款?
  2.   

根据我对CTE的理解,创建CTE背后的整个想法是,您可以创建一个临时结果集并以命名方式使用它,就像{{1中的常规表一样},SELECTINSERTUPDATE语句。

由于CTE在逻辑上非常类似于视图,因此CTE查询中的DELETE语句必须遵循与创建视图时相同的要求。请参阅MSDN

上的以下链接中的** CTE查询定义*部分

此外,因为CTE基本上是一个命名的结果集,它可以像SELECTSELECTINSERTUPDATE语句中的任何表一样使用,您可以选择在任何这些陈述中使用CTE时提到的各种操作符。

关于

  

2.如果我需要使用其中一些子句进行某种递归,那么我是编写递归存储过程的唯一选择吗?

另外,我非常确定您可以在视图 / CTE选择声明中至少使用上面提到的一些关键字。例如:请参阅CTE中使用DELETE here in the Creating a simple common table expression example

也许,如果你能提供一个你想要实现的样本场景,我们可以建议一些可能的解决方案。