【问题标题】:Why are recursive CTEs unable to use grouping and other clauses?为什么递归 CTE 不能使用分组和其他子句?
【发布时间】:2011-04-23 15:11:02
【问题描述】:

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

  • 不同
  • 分组依据
  • 顶部
  • 正确
  • 外连接

所以我想我有两个问题:

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

谢谢。

【问题讨论】:

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


    【解决方案1】:

    参考:-

    1. 为了更好地理解我的情况和SQL,为什么不允许这些子句?

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

    因为 CTE 在逻辑上非常类似于视图,所以 CTE 查询中的 SELECT 语句必须遵循与创建视图相同的要求。请参阅MSDN 上以下链接中的 **CTE 查询定义* 部分

    此外,由于 CTE 基本上是一个命名结果集,它可以像 SELECTINSERTUPDATEDELETE 语句中的任何表一样使用,您始终可以选择使用各种运算符您在任何这些陈述中使用 CTE 时提到的。

    关于

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

    另外,我很确定您至少可以在 view / CTE 选择语句 中使用上面提到的一些关键字。例如:参考GROUP BY在CTE中的使用here in the Creating a simple common table expression example

    也许,如果您可以提供一个示例场景来说明您想要实现的目标,我们可以建议一些可能的解决方案。

    【讨论】:

    • 两个链接指向同一个网页,我不推荐它,因为它包含很多不一致和错误。你真的用它运行过脚本吗?并阅读它?请改用msdn.microsoft.com/en-us/library/ms175972(v=SQL.100).aspx
    • @vgv8 - 是的,两个链接都指向同一个网页 - 我指的是同一个页面,只是答案中的不同部分。另外,我只是要求 OP 查看那里列出的示例,以供参考如何使用 Group By。我不知道我所引用的部分有任何不一致之处,但如果你能突出这些部分,那将有所帮助!
    • 在“C. 多次引用公用表表达式”部分中链接脚本时,不会多次引用 CTE。以下脚本根本不运行,因为不存在 dbo.MyEmployees
    • @vgv8 - 实际上,我仅指的是我的回复中指定的示例“创建简单的公用表表达式”,因为这是使用 GROUP BY 子句的示例,因为 OP 已经发布了组By 不能在 CTE 中使用。但你的观点注意到了!
    猜你喜欢
    • 2012-02-25
    • 2017-08-30
    • 2018-08-05
    • 1970-01-01
    • 2018-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多