我认为递归CTE是基于设置的,但在recent SO post有人提到它们是循环。
是否设置了递归CTE?假设基于集合的操作不能成为循环,我错了吗?
答案 0 :(得分:2)
如果它是递归的,它仍然被认为是一个循环。 虽然基于一个语句设置,但反复调用它可以被认为是一个循环。这是关于基于所使用的上下文的定义或措辞的争论。它们是基于集合的语句,但处理过程简单地称为循环过程。
对于那些感兴趣的人来说,这是关于CTE的表现的一个很好的小写:
http://explainextended.com/2009/11/18/sql-server-are-the-recursive-ctes-really-set-based/
答案 1 :(得分:2)
它们是基于设置的。递归集仍然是集。
但是,如果你看一个足够强大的放大镜玻璃,所有的设定操作都是循环。最终,代码在CPU上运行,CPU执行一系列串行指令,这些指令在离散的内存区域上运行。换句话说,没有面向集合的硬件。 “面向集体”是一个逻辑概念。 所有 SQL操作最终使用某种形式的循环实现的事实是一个实现细节。
答案 2 :(得分:0)
我认为需要做的区别是"尾部递归"与#34;一般递归"。
所有尾递归都可以实现为循环 - 无需堆栈。
一般递归支持也可以实现为循环 - 但是有一个堆栈。
递归CTE是Tail递归,因此本质上是一个循环。唯一的区别是终止条件由SQL语义/执行引擎处理。每次循环迭代的输出都是UNIONed或您指定的任何设置。