C'est ce qu'on appelle une expression de table commune et c'est un moyen d'exprimer une requête récursive en SQL :
t(n)
définit le nom du CTE comme t
, avec une seule colonne nommée n
. C'est similaire à un alias pour une table dérivée :
select ...
from (
...
) as t(n);
La récursivité commence par la valeur 1 (c'est-à-dire les values (1)
partie) puis y ajoute récursivement un jusqu'à ce que le 99 soit atteint. Il génère donc les nombres de 1 à 99. Ensuite, la requête finale résume ensuite tous ces nombres.
n
est un nom de colonne, pas une "variable" et l'"affectation" se fait de la même manière que n'importe quelle récupération de données.
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 vous "déroulez" la récursivité (qui est en fait une itération), vous obtiendrez quelque chose comme ceci :
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)
Plus de détails dans le manuel :
https://www .postgresql.org/docs/current/static/queries-with.html