Sql 为什么递归CTE不能使用分组和其他子句?
我最近学习了递归公共表表达式(CTE),同时寻找一种方法来构建某些数据的特定视图。在花了一段时间写下我的查询的第一次迭代是如何工作的之后,我把它变成了一个CTE来观察整个过程。我惊讶地发现分组不起作用,所以我将其替换为“selecttop1,orderby”。我再次对“TOP”不被允许感到惊讶,并发现所有这些子句都不允许出现在CTE的递归部分中:Sql 为什么递归CTE不能使用分组和其他子句?,sql,sql-server,tsql,sql-server-2005,recursion,Sql,Sql Server,Tsql,Sql Server 2005,Recursion,我最近学习了递归公共表表达式(CTE),同时寻找一种方法来构建某些数据的特定视图。在花了一段时间写下我的查询的第一次迭代是如何工作的之后,我把它变成了一个CTE来观察整个过程。我惊讶地发现分组不起作用,所以我将其替换为“selecttop1,orderby”。我再次对“TOP”不被允许感到惊讶,并发现所有这些子句都不允许出现在CTE的递归部分中: 明显的 分组 拥有 顶 左 对 外接 所以我想我有两个问题: 为了更好地理解我的情况和SQL,为什么不允许使用这些子句 如果我需要使用其中的一些子
- 明显的
- 分组
- 拥有
- 顶
- 左
- 对
- 外接
SELECT
、INSERT
、UPDATE
或DELETE
语句中的常规表一样
因为CTE在逻辑上非常类似于视图,所以CTE查询中的SELECT
语句必须遵循与创建视图相同的要求。请参阅以下链接中的**CTE查询定义*部分
此外,由于CTE基本上是一个命名的结果集,它可以像SELECT
、INSERT
、UPDATE
或DELETE
语句中的任何表一样使用,因此在这些语句中使用CTE时,您始终可以选择使用您提到的各种运算符
关于
2.如果我需要使用其中的一些子句进行某种递归,那么编写递归存储过程的唯一替代方法是什么
另外,我非常确信,您至少可以在视图中使用上面提到的一些关键字。例如:在CTE中使用分组依据
也许,如果您能提供一个您试图实现的示例场景,我们可以建议一些可能的解决方案。两个链接都指向同一个网页,我不推荐它,因为它包含许多不一致和错误。你真的用它来运行脚本吗?然后读它?使用instead@vgv8-是的,两个链接都指向同一个网页-我指的是同一个网页,只是回答中的不同部分。另外,我只是想让OP看看上面列出的例子,作为如何使用Group By的参考。我不知道我引用的部分有任何不一致之处,但如果您能突出显示这些,这将有所帮助!!在链接中,“C.多次引用公共表表达式”部分中的脚本不会多次引用CTE。以下脚本根本不运行,因为不存在dbo。MyEmployees@vgv8-事实上,我只是指我在回复中指定的“创建简单公共表表达式”示例,因为该示例使用GROUP BY子句,因为OP发布的GROUP BY不能在CTE中使用。但是你的观点被注意到了!!