Това се нарича израз на обща таблица и е начин за изразяване на рекурсивна заявка в SQL:
t(n)
дефинира името на CTE като t
, с една колона с име n
. Подобно е на псевдоним за производна таблица:
select ...
from (
...
) as t(n);
Рекурсията започва със стойност 1 (това са values (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;
Ако „разгърнете“ рекурсията (която всъщност е итерация), тогава ще получите нещо подобно:
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)
Повече подробности в ръководството:
https://www .postgresql.org/docs/current/static/queries-with.html