Dette kaldes et almindeligt tabeludtryk og er en måde at udtrykke en rekursiv forespørgsel på i SQL:
t(n)
definerer navnet på CTE'en som t
, med en enkelt kolonne med navnet n
. Det ligner et alias for en afledt tabel:
select ...
from (
...
) as t(n);
Rekursionen starter med værdien 1 (det er values (1)
del) og føjer derefter en rekursivt til den, indtil 99 er nået. Så den genererer tallene fra 1 til 99. Derefter opsummerer den sidste forespørgsel alle disse tal.
n
er et kolonnenavn, ikke en "variabel", og "tildelingen" sker på samme måde som enhver datahentning.
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;
Hvis du "ruller ud" rekursionen (som faktisk er en iteration), vil du ende med noget som dette:
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)
Flere detaljer i manualen:
https://www. .postgresql.org/docs/current/static/queries-with.html