【问题标题】:Why does this CTE act like a counter?为什么这个 CTE 表现得像一个计数器?
【发布时间】:2019-01-23 18:56:34
【问题描述】:

以下查询的行为与我对 CTE 的理解不同,有人可以详细说明为什么会这样吗?

with cte (n) as
(
    select 1
    union all
    select n + 1 from cte where n<10
)
select * from cte

我期待以下输出:

1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10

但我得到了:

1,2,3,4,5,6,7,8,9,10

为什么?

【问题讨论】:

  • 重复数字背后的任何原因?
  • 没有真正的原因,我只是在寻找一个解释,为什么查询输出不是我所期望的。看来我误解了查询中的某些内容是如何工作的
  • 你为什么期望它是那个输出?你认为它是如何工作的?
  • 显然您查询的是第二个结果。如果您希望它产生第一个结果,请更改您的查询。

标签: sql tsql sql-server-2014


【解决方案1】:

CTE 基本上是一个可以引用自身的可重用子查询,因此您的最终查询相当于:

SELECT 1
UNION ALL (SELECT 2 
           UNION ALL (SELECT 3 ...

直到n 达到 10。

【讨论】:

    【解决方案2】:

    select 1,可能不会打扰你。结果是1

    递归查询 select n + 1 from cte where n&lt;10 对 CTE 中的所有 new 行重复执行,直到没有新行产生(或直到达到 MaxRecursion 限制)。

    第一次通过唯一的新行是来自锚点的1,结果是2n + 1)。现在有一个新行:2。结果:3。起泡、冲洗、重复直到n&lt;10 不会生成新行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-07
      • 1970-01-01
      • 2012-06-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多