Esto se denomina expresión de tabla común y es una forma de expresar una consulta recursiva en SQL:
t(n)
define el nombre del CTE como t
, con una sola columna llamada n
. Es similar a un alias para una tabla derivada:
select ...
from (
...
) as t(n);
La recursión comienza con el valor 1 (que son los values (1)
part) y luego recursivamente le agrega uno hasta que se alcanza el 99. Entonces genera los números del 1 al 99. Luego, la consulta final resume todos esos números.
n
es un nombre de columna, no una "variable" y la "asignación" sucede de la misma manera que cualquier recuperación de datos.
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;
Si "desenrolla" la recursividad (que de hecho es una iteración), terminará con algo como esto:
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)
Más detalles en el manual:
https://www .postgresql.org/docs/current/static/queries-with.html