Isso é chamado de expressão de tabela comum e é uma maneira de expressar uma consulta recursiva em SQL:
t(n)
define o nome do CTE como t
, com uma única coluna chamada n
. É semelhante a um alias para uma tabela derivada:select ...
from (
...
) as t(n);
A recursão começa com o valor 1 (que são os
values (1)
parte) e, em seguida, adiciona um recursivamente até que o 99 seja alcançado. Então ele gera os números de 1 a 99. Então a consulta final soma todos esses números. n
é um nome de coluna, não uma "variável" e a "atribuição" acontece da mesma forma que qualquer recuperação de dados. 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;
Se você "desenrolar" a recursão (que na verdade é uma iteração), você terminará com algo assim:
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)
Mais detalhes no manual:
https://www .postgresql.org/docs/current/static/queries-with.html