Uma Sequência Numérica
Parte da seção Além do Básico do Journey de SQL da Coddy — lição 20 de 27.
Você conheceu a palavra-chave WITH em Fundamentos para nomear uma subconsulta, também conhecida como uma CTE (Common Table Expression). Uma CTE recursiva vai um passo além: ela permite que a subconsulta se refira a si mesma, construindo um resultado linha por linha.
A versão mais simples gera uma sequência de números sem uma tabela subjacente. O formato é sempre o mesmo:
WITH RECURSIVE counter(n) AS (
SELECT 1 -- âncora: a linha inicial
UNION ALL
SELECT n + 1 FROM counter WHERE n < 5 -- recursivo: constrói o próximo a partir do anterior
)
SELECT n FROM counterLeia da seguinte forma: comece com n = 1, então continue adicionando linhas onde cada n é o n + 1 anterior, parando quando o WHERE parar de corresponder. O resultado é 1, 2, 3, 4, 5.
As duas partes do corpo são unidas por UNION ALL. A primeira é a âncora: as linhas semente. A segunda é o passo recursivo: ele consulta a própria CTE.
Desafio
FácilEscreva uma CTE recursiva chamada powers com duas colunas:
i: o índice de iteração, começando em1p:2elevado ài-ésima potência (2,4,8, …)
Pare assim que p exceder 1000. Retorne ambas as colunas, ordenadas por i de forma ascendente.
Folha de consulta
Um CTE recursivo permite que uma subconsulta se refira a si mesma, construindo resultados linha por linha:
WITH RECURSIVE counter(n) AS (
SELECT 1 -- âncora: linha inicial
UNION ALL
SELECT n + 1 FROM counter WHERE n < 5 -- passo recursivo
)
SELECT n FROM counter- Âncora: a(s) linha(s) semente (primeiro
SELECT) - Passo recursivo: consulta o próprio CTE para produzir a próxima linha
- Para quando a condição
WHEREnão for mais atendida - As duas partes são unidas com
UNION ALL
Experimente você mesmo
WITH RECURSIVE powers(i, p) AS (
-- âncora: i=1, p=2
-- recursivo: i+1, p*2, até que p atinja 1000
)
SELECT i, p FROM powers ORDER BY i
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.