Detta kallas ett vanligt tabelluttryck och är ett sätt att uttrycka en rekursiv fråga i SQL:
t(n)
definierar namnet på CTE som t
, med en enda kolumn som heter n
. Det liknar ett alias för en härledd tabell:
select ...
from (
...
) as t(n);
Rekursionen börjar med värdet 1 (det är values (1)
del) och lägger sedan rekursivt till en till den tills 99 nås. Så den genererar siffrorna från 1 till 99. Sedan summerar den slutliga frågan alla dessa siffror.
n
är ett kolumnnamn, inte en "variabel" och "tilldelningen" sker på samma sätt som all datahämtning.
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;
Om du "rullar upp" rekursionen (som i själva verket är en iteration) så skulle du sluta med något sånt här:
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)
Mer information i manualen:
https://www. .postgresql.org/docs/current/static/queries-with.html