关于WITH RECURSIVE Query Postgres的可能解释

Liv*_*ors 2 sql postgresql common-table-expression

我一直在阅读有关 Postgres 中的 With Query 的内容。这就是我惊讶的地方

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)

我无法理解查询的评估是如何工作的。

  • t(n) 听起来像是一个带有参数的函数。n的值是如何传递的。

关于 SQL 中递归语句的崩溃如何发生的任何见解。

小智 5

这称为公用表表达式,是一种在 SQL 中表达递归查询的方法:

t(n)将 CTE 的名称定义为t,其中有一列名为n。它类似于派生表的别名:

select ... 
from (
  ...
) as t(n);
Run Code Online (Sandbox Code Playgroud)

递归从值 1(即部分values (1))开始,然后递归地加 1,直到达到 99。因此它生成从 1 到 99 的数字。然后最终查询将所有这些数字相加。

n是列名,而不是“变量”,“赋值”的发生方式与任何数据检索相同。

WITH RECURSIVE t(n) AS (
    VALUES (1) --<< this is the recursion "root"
  UNION ALL
    SELECT n+1 FROM t WHERE n < 100 --<< this is the "recursive part"
)
SELECT sum(n) FROM t;
Run Code Online (Sandbox Code Playgroud)

如果您“展开”递归(实际上是迭代),那么您最终会得到如下结果:

select x.n + 1
from (
  select x.n + 1
  from (
    select x.n + 1
    from (
      select x.n + 1
      from (
         values (1)
      ) as x(n) 
    ) as x(n)
  ) as x(n)
) as x(n)
Run Code Online (Sandbox Code Playgroud)

手册中的更多详细信息:
https ://www.postgresql.org/docs/current/static/queries-with.html