小编Fal*_*4rm的帖子

如何解释sql with-recursive语句?

我想请教一些关于理解"递归"如何工作的帮助.更确切地说,为什么锚查询(非递归项)不会复制到CTE的子调用中.我尽力单独理解,但我不确定.

首先让我们以PostgreSQL为例,这是我发现的最简单的一个(总和为1到100):

WITH RECURSIVE t(n) AS (
      VALUES (1)
      UNION ALL
        SELECT n+1 FROM t WHERE n < 100)

    SELECT sum(n) FROM t;
Run Code Online (Sandbox Code Playgroud)

我的代码演练(我使用下面的链接):

  1. 评估非递归术语.对于UNION [...].

    在递归查询的结果中包括所有剩余的行,并将它们放在临时工作表中.

  2. 只要工作表不为空,请重复以下步骤:

    • 评估递归项,用工作表的当前内容替换递归自引用.对于UNION [...].在递归查询的结果中包括所有剩余行,并将它们放在临时中间表中.

    • 用中间表的内容替换工作表的内容,然后清空中间表."

LVL 0:

  1. 非递归部分

    • CTE:(N)1
    • 工作表:(N)1
  2. 递归部分

    • CTE:(N)1
    • 工作表:(N)1
    • 中间表(N)2

(这是我想的那部分) - 取代WORKING TABLE

因此递归t将使用WORKING TABLE来执行SELECT n + 1并将结果放在INTERMEDIATE TABLE中.

  1. UNION ALL

    • CTE:(N)1 2
    • 工作表:(N)2
    • 中间表:清洁
  2. 然后我们通过t的调用进入下一个lvl?(因为END条件WHERE n <100 = FALSE)

LVL 1:

我们知道coz postgreSQL说它"只要工作表不为空,重复递归步骤"所以它将重复步骤2.和3.(如果我是正确的)直到END条件然后执行SUM.

但是,如果我只是通过下一个t的调用,我们不应该首先执行VALUES(1)吗?

我真的很困惑它是如何可能的.

最好的问候,Falt4rm

database postgresql recursion recursive-query with-statement

5
推荐指数
1
解决办法
559
查看次数