Questa è chiamata espressione di tabella comune ed è un modo per esprimere una query ricorsiva in SQL:
t(n)
definisce il nome del CTE come t
, con una singola colonna denominata n
. È simile a un alias per una tabella derivata:
select ...
from (
...
) as t(n);
La ricorsione inizia con il valore 1 (che sono i values (1)
parte) e poi ricorsivamente ne aggiunge uno fino a raggiungere il 99. Quindi genera i numeri da 1 a 99. Quindi la query finale riassume tutti quei numeri.
n
è il nome di una colonna, non una "variabile" e l'"assegnazione" avvengono allo stesso modo di qualsiasi recupero di dati.
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 "svolgi" la ricorsione (che in realtà è un'iterazione), ti ritroverai con qualcosa del genere:
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)
Maggiori dettagli nel manuale:
https://www. .postgresql.org/docs/current/static/queries-with.html