Considere a seguinte instrução SQL: WITH RECURSIVE cte(n) A...
Considere a seguinte instrução SQL:
WITH RECURSIVE cte(n) AS (
SELECT 1
UNION ALL
SELECT n+1 FROM cte WHERE n<5
)
SELECT * FROM cte;
Ao ser executada no PostgreSQL, ela produz como resultado:
Gabarito comentado
Confira o gabarito comentado por um dos nossos professores
A alternativa correta é a C - 1,2,3,4,5.
Para entendermos o motivo pelo qual a alternativa C é a correta, é importante compreender o conceito de Common Table Expressions (CTEs) recursivas no PostgreSQL. Uma CTE recursiva permite que você execute instruções SQL que referenciam a própria CTE, podendo então criar loops controlados para gerar ou percorrer conjuntos de dados.
No comando SQL apresentado, temos a seguinte estrutura:
- Inicia-se com a cláusula WITH RECURSIVE, o que sinaliza o início de uma CTE recursiva.
- A CTE é nomeada como cte e possui uma coluna n.
- O bloco que define a CTE começa com a seleção de um número inicial, que é 1.
- Após a seleção do número inicial, a instrução UNION ALL é usada para combinar o resultado de uma consulta recorrente. Esta consulta recorrente adiciona 1 ao valor atual de n da CTE.
- A recursão continua até que a condição n<5 não seja mais verdadeira. Isso significa que a recursão irá parar uma vez que n atinja o valor de 5.
Ao executar o comando, o PostgreSQL realizará as seguintes etapas:
- Seleciona o número inicial 1.
- Adiciona 1 ao número atual para formar a próxima linha (2).
- Repete o passo 2, agora partindo do valor 2, e assim sucessivamente até que o valor de n seja 5, pois a condição especificada é n<5.
- Assim que n atinge o valor 5, a condição para a recursão falha e o processo é finalizado.
A sequência gerada pela consulta será então 1, 2, 3, 4, 5, onde cada número é o resultado de uma iteração da CTE até que a condição de parada seja atendida. Essa sequência corresponde aos números iniciais e à progressão da consulta até que o valor de n seja maior ou igual a 5, portanto a alternativa correta é a C - 1,2,3,4,5.
Clique para visualizar este gabarito
Visualize o gabarito desta questão clicando no botão abaixo
Comentários
Veja os comentários dos nossos alunos
GAB. Letra C.
É mais extenso explicar, mas a ideia é simples.
Não sei se os conceitos estão todos certos, mas resolvi simulando as instruções conforme segue:
Obs.: Cada iteração da recursividade vai executar os dois selects lá dentro. Como não foi passado nenhum parâmetro para o select que chama a recursividade (SELECT * FROM cte), vou assumir que n vai iniciar com zero, ficando:
1) Primeira passagem da recursividade, com n valendo 0:
SELECT 1 = resulta 1
SELECT n+1 FROM cte WHERE n<5 = resulta 1 também, pois vai ser 0+1
Aplicando o UNION ALL ao resultado desta iteração, vamos ter: união de 1 e 1, resultando somente 1.
Como esta é a primeira passagem da recursividade, este é o resultado final da primeira iteração (1).
2) Segunda passagem da recursividade, com n valendo 1:
SELECT 1 = resulta 1
SELECT n+1 FROM cte WHERE n<5 = resulta 2, pois vai ser 1+1
Aplicando o UNION ALL ao resultado desta iteração, vamos ter: união de 1 e 2, resultando 1 e 2.
Unindo com o resultado anterior da recursividade (1), vamos ter o UNION ALL de (1) com (1 e 2), resultando ao final desta iteração (1 e 2).
3) Terceira passagem da recursividade, com n valendo 2:
SELECT 1 = resulta 1
SELECT n+1 FROM cte WHERE n<5 = resulta 3, pois vai ser 2+1
Aplicando o UNION ALL ao resultado desta iteração, vamos ter: união de 1 e 3, resultando 1 e 3.
Unindo com o resultado anterior da recursividade (1 e 2), vamos ter o UNION ALL de (1 e 2) com (1 e 3), resultando ao final desta iteração (1, 2 e 3).
4) Quarta passagem da recursividade, com n valendo 3:
SELECT 1 = resulta 1
SELECT n+1 FROM cte WHERE n<5 = resulta 4, pois vai ser 3+1
Aplicando o UNION ALL ao resultado desta iteração, vamos ter: união de 1 e 4, resultando 1 e 4.
Unindo com o resultado anterior da recursividade (1, 2 e 3), vamos ter o UNION ALL de (1, 2 e 3) com (1 e 4), resultando ao final desta iteração (1, 2, 3 e 4).
5) Quinta passagem da recursividade, com n valendo 4:
SELECT 1 = resulta 1
SELECT n+1 FROM cte WHERE n<5 = resulta 5, pois vai ser 4+1
Aplicando o UNION ALL ao resultado desta iteração, vamos ter: união de 1 e 5, resultando 1 e 5.
Unindo com o resultado anterior da recursividade (1, 2, 3 e 4), vamos ter o UNION ALL de (1, 2, 3 e 4) com (1 e 5), resultando ao final desta iteração (1, 2, 3, 4 e 5).
6) Sexta passagem da recursividade, com n valendo 5:
SELECT 1 = resulta 1
SELECT n+1 FROM cte WHERE n<5 = não executa mais, pois o n é igual a 5, finalizando a recursividade
Aplicando o UNION ALL ao resultado desta iteração, vamos ter: união de 1 com nada, resultando 1.
Unindo com o resultado anterior da recursividade (1, 2, 3, 4 e 5), vamos ter o UNION ALL de (1, 2, 3, 4 e 5) com (1), resultando ao final desta iteração (1, 2, 3, 4 e 5).
Espero que ajude! :)
Clique para visualizar este comentário
Visualize os comentários desta questão clicando no botão abaixo