Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 为什么递归CTE不能使用分组和其他子句?_Sql_Sql Server_Tsql_Sql Server 2005_Recursion - Fatal编程技术网

Sql 为什么递归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,为什么不允许使用这些子句 如果我需要使用其中的一些子

我最近学习了递归公共表表达式(CTE),同时寻找一种方法来构建某些数据的特定视图。在花了一段时间写下我的查询的第一次迭代是如何工作的之后,我把它变成了一个CTE来观察整个过程。我惊讶地发现分组不起作用,所以我将其替换为“selecttop1,orderby”。我再次对“TOP”不被允许感到惊讶,并发现所有这些子句都不允许出现在CTE的递归部分中:

  • 明显的
  • 分组
  • 拥有
  • 外接
所以我想我有两个问题:

  • 为了更好地理解我的情况和SQL,为什么不允许使用这些子句
  • 如果我需要使用其中的一些子句进行某种递归,那么编写递归存储过程的唯一替代方法是什么
  • 谢谢。

    指的是:-

  • 为了更好地理解我的情况和SQL,为什么不允许使用这些子句
  • 根据我对CTE的理解,创建CTE背后的整个想法是,您可以创建一个临时结果集,并以命名的方式使用它,就像
    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中使用。但是你的观点被注意到了!!