Considere a seguinte instrução SQL: WITH RECURSIVE cte(n) A...

Próximas questões
Com base no mesmo assunto
Q978945 Banco de Dados

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:

Alternativas

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:

  1. Seleciona o número inicial 1.
  2. Adiciona 1 ao número atual para formar a próxima linha (2).
  3. 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.
  4. 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