最近,我在寻找一种方法来构建某些数据的特定视图时了解了递归公用表表达式 (CTE)。在花了一些时间写出查询的第一次迭代如何工作后,我将其转换为 CTE 来观看整个过程。我很惊讶地发现分组不起作用,所以我只是将其替换为“Select TOP 1, ORDER BY”等效项。我再次惊讶于“TOP”是不允许的,并发现所有这些子句在 CTE 的递归部分中都不允许:
- DISTINCT
- GROUP BY
- HAVING
- TOP
- LEFT
- RIGHT
- 外连接
所以我想我有两个问题:
- 为了更好地了解我的情况和 SQL,为什么不允许使用这些子句?
- 如果我需要使用其中一些子句进行某种递归,那么编写递归存储过程是我唯一的选择吗?
Thanks.
参考:-
- 为了更好地了解我的情况和 SQL,为什么不允许使用这些子句?
根据我对 CTE 的理解,创建 CTE 背后的整个想法是,您可以创建一个临时结果集并在named像普通表一样SELECT
, INSERT
, UPDATE
, or DELETE
声明。
因为 CTE 在逻辑上非常类似于视图,SELECT
CTE 查询中的语句必须遵循与创建视图所用的相同要求。请参阅以下链接中的 **CTE 查询定义* 部分MSDN http://msdn.microsoft.com/en-us/library/ms175972.aspx
另外,因为 CTE 基本上是一个命名结果集,并且可以像中的任何表一样使用SELECT
, INSERT
, UPDATE
, or DELETE
语句,当您在任何这些语句中使用 CTE 时,您始终可以选择使用您提到的各种运算符。
与关于
2.如果我需要使用其中一些子句进行某种递归,那么编写递归存储过程是我唯一的选择吗?
另外,我非常确定您至少可以在上面提到的一些关键字中使用view / CTE 选择语句。例如:参考使用GROUP BY
在 CTE 中在创建一个简单的公用表表达式示例中 http://msdn.microsoft.com/en-us/library/ms175972.aspx
也许,如果您可以提供您想要实现的目标的示例场景,我们可以建议一些可能的解决方案。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)