Questão de Banco de Dados — PostgreSQL — CESPE / CEBRASPE 2025
- Código
- ce417251
- Banca
- CESPE / CEBRASPE
- Órgão
- TRF 6
- Ano
- 2025
- Cargo
- AJ TRF6
- CCerto
- EErrado
GabaritoC — Certo
Gabarito: Certo. A consulta WITH RECURSIVE apresentada gera uma sequência de potências de 2 (1, 2, 4, 8, 16...) e, com o LIMIT 5, retorna exatamente as cinco primeiras linhas: 1, 2, 4, 8 e 16. O comportamento está correto conforme a semântica de CTEs recursivas do PostgreSQL.
Uma CTE (Common Table Expression) é uma tabela temporária definida dentro da própria consulta, que existe apenas durante a execução dela. A palavra-chave RECURSIVE permite que essa CTE faça referência a si mesma, criando uma recursão. A estrutura básica de uma CTE recursiva tem duas partes unidas por UNION (ou UNION ALL):
Termo base (âncora): a primeira parte do UNION, que define o ponto de partida. No código, é SELECT 1, que insere o valor 1 na CTE.
Termo recursivo: a segunda parte, que referencia a própria CTE. No código, é SELECT n*2 FROM t, que, para cada linha já existente em t, gera uma nova linha com o dobro do valor.
O PostgreSQL executa essa recursão em iterações: começa com o termo base, depois aplica o termo recursivo sobre o resultado da iteração anterior, e repete até que nenhuma nova linha seja gerada (ou até o limite de profundidade, que por padrão é 1000).
Vamos simular a execução passo a passo:
Iteração 0 (âncora): t contém {1}.
Iteração 1: aplica n*2 sobre {1} → gera {2}. t agora tem {1, 2}.
Iteração 2: aplica n*2 sobre {2} → gera {4}. t agora tem {1, 2, 4}.
Iteração 3: aplica n*2 sobre {4} → gera {8}. t agora tem {1, 2, 4, 8}.
Iteração 4: aplica n*2 sobre {8} → gera {16}. t agora tem {1, 2, 4, 8, 16}.
Iteração 5: aplica n*2 sobre {16} → gera {32}. t agora tem {1, 2, 4, 8, 16, 32}.
A recursão continuaria indefinidamente (1, 2, 4, 8, 16, 32, 64, ...), pois sempre haverá um novo valor. No entanto, a consulta externa aplica LIMIT 5, que interrompe a execução assim que 5 linhas são produzidas. O PostgreSQL é inteligente o suficiente para parar a recursão quando o LIMIT é atingido, sem precisar calcular todas as linhas infinitas.
O resultado final, portanto, é exatamente o mostrado no enunciado: 1, 2, 4, 8, 16. A ordem de exibição pode variar (não há ORDER BY), mas como o LIMIT é aplicado, o PostgreSQL tende a retornar as linhas na ordem em que foram geradas, que é a ordem crescente das potências de 2.
A pegadinha que a banca poderia explorar aqui é a diferença entre UNION e UNION ALL. O UNION elimina duplicatas, mas neste caso não há duplicatas, então o resultado seria o mesmo com UNION ALL. Outra pegadinha seria pensar que a recursão é infinita e o comando nunca terminaria, mas o LIMIT resolve isso.
Guarde a estrutura da CTE recursiva: âncora + termo recursivo unidos por UNION. É essa estrutura que permite resolver problemas como hierarquias, grafos e sequências numéricas dentro do SQL.
A execução do código está correta e o resultado apresentado é o esperado. A CTE recursiva gera a sequência de potências de 2, e o LIMIT 5 restringe a saída às cinco primeiras linhas: 1, 2, 4, 8 e 16. Não há nenhum erro de sintaxe ou de lógica no comando.
Para questões de CTE recursiva, identifique primeiro a âncora (o ponto de partida) e depois o termo recursivo (a regra de geração). Simule as primeiras iterações no papel — isso resolve a maioria dos problemas. E lembre-se: UNION elimina duplicatas, UNION ALL não; mas se a sequência não gera duplicatas, o resultado é o mesmo.
Gabarito: Certo.
Link permanente: /questoes/ce417251