To se nazývá společný tabulkový výraz a je to způsob vyjádření rekurzivního dotazu v SQL:
t(n)
definuje název CTE jako t
s jedním sloupcem s názvem n
. Je to podobné jako alias pro odvozenou tabulku:
select ...
from (
...
) as t(n);
Rekurze začíná hodnotou 1 (to jsou values (1)
část) a poté k ní rekurzivně přidává jednu, dokud není dosaženo 99. Vygeneruje tedy čísla od 1 do 99. Poté závěrečný dotaz sečte všechna tato čísla.
n
je název sloupce, ne "proměnná" a "přiřazení" se děje stejným způsobem jako jakékoli získávání dat.
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;
Pokud „rozbalíte“ rekurzi (což je ve skutečnosti iterace), skončíte s něčím takovým:
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)
Více podrobností v manuálu:
https://www .postgresql.org/docs/current/static/queries-with.html