Nazywa się to zwykłym wyrażeniem tabelowym i jest sposobem wyrażenia rekurencyjnego zapytania w SQL:
t(n)
definiuje nazwę CTE jako t
, z pojedynczą kolumną o nazwie n
. Jest podobny do aliasu tabeli pochodnej:
select ...
from (
...
) as t(n);
Rekurencja zaczyna się od wartości 1 (to są values (1)
część), a następnie rekursywnie dodaje do niego jeden, aż do osiągnięcia 99. Generuje więc liczby od 1 do 99. Następnie końcowe zapytanie sumuje wszystkie te liczby.
n
to nazwa kolumny, nie „zmienna” i „przypisanie” odbywają się w taki sam sposób, jak każde pobieranie danych.
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;
Jeśli „rozwiniesz” rekursję (która w rzeczywistości jest iteracją), otrzymasz coś takiego:
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)
Więcej szczegółów w instrukcji:
https://www .postgresql.org/docs/current/static/queries-with.html