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)
我无法理解查询的评估是如何工作的。
关于 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
| 归档时间: |
|
| 查看次数: |
1962 次 |
| 最近记录: |