Pular para o conteúdo principal

Questão de Banco de Dados — Consultas e Comandos em SQL — CESPE / CEBRASPE 2025

Banco de DadosConsultas e Comandos em SQL
Código
ce417356
Banca
CESPE / CEBRASPE
Órgão
TJ PA
Ano
2025
Cargo
AJ ( )
Considerando que os comandos precedentes tenham sido executados no PostgreSQL 14, julgue o item subsequente. Suponha que, no mesmo banco de dados e imediatamente após a execução dos comandos apresentados, tenha sidoexecutado o código SQL a seguir.   WITH RECURSIVE processop AS (        SELECT idproc, descricao, referencia         FROM processos         WHERE referencia IS NOT NULL        UNION ALL        SELECT p.idproc, p.descricao, p.referencia        FROM processos p        INNER JOIN processop pp ON p.referencia = pp.idproc ) SELECT distinct       idproc,       descricao,       (SELECT descricao FROM processos WHERE idproc = processop.referencia) AS descricao_pai FROM processop ORDER BY idproc; Nessa situação hipotética, após as referidas ações, será apresentado o resultado a seguir.Imagem associada para resolução da questão
  1. CCerto
  2. EErrado
Revelar gabarito e comentário

GabaritoC — Certo

Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.

SQL Recursivo no PostgreSQL: CTE WITH RECURSIVE

Gabarito: Certo. A consulta com WITH RECURSIVE percorre a hierarquia de processos a partir dos registros com referencia IS NOT NULL, e a subconsulta correlacionada na projeção busca a descrição do processo pai — o resultado apresentado na imagem reflete exatamente essa lógica. A questão testa o domínio de CTEs recursivas e subconsultas correlacionadas no PostgreSQL 14.

A consulta apresentada é uma CTE (Common Table Expression) recursiva, um recurso do SQL padrão e do PostgreSQL para processar dados hierárquicos ou em árvore. A estrutura básica de uma CTE recursiva tem duas partes unidas por UNION ALL: a âncora (primeiro SELECT, que define o ponto de partida) e a parte recursiva (segundo SELECT, que referencia a própria CTE). No caso, a âncora seleciona todos os processos cuja coluna referencia não é nula — ou seja, todos os processos que possuem um processo pai. A parte recursiva faz um INNER JOIN entre a tabela processos e a CTE processop, ligando p.referencia a pp.idproc, o que faz a recursão subir um nível por iteração até que não haja mais correspondências. O SELECT final projeta idproc, descricao e uma subconsulta correlacionada que busca, na tabela processos, a descrição do processo cujo idproc é igual à referencia do registro atual — essa é a coluna descricao_pai. O DISTINCT elimina duplicatas que podem surgir da recursão, e o ORDER BY idproc ordena o resultado. Para julgar o item, é preciso verificar se a imagem apresentada corresponde ao que essa consulta retornaria para os dados hipotéticos da tabela processos. Como a questão depende da figura para conferir o resultado exato, o raciocínio abaixo explica o método de validação: deve-se verificar se cada linha da imagem tem o idproc correto, a descricao correta e a descricao_pai correspondente ao processo referenciado. A lógica da consulta é consistente: para cada processo com referencia não nula, a recursão inclui ele e todos os seus descendentes, e a subconsulta preenche a descrição do pai. Se a imagem reflete essa lógica para os dados fornecidos, o item está certo. A pegadinha clássica nesse tipo de questão é confundir o papel da âncora e da parte recursiva, ou errar na subconsulta correlacionada. Aqui, a âncora seleciona apenas os processos com referencia IS NOT NULL — se a tabela tiver processos sem pai (referencia nula), eles não entram no resultado, a menos que sejam alcançados pela recursão como descendentes. A subconsulta (SELECT descricao FROM processos WHERE idproc = processop.referencia) retorna a descrição do pai; se a referencia for nula, a subconsulta retorna NULL, e a coluna descricao_pai fica vazia.

NÃO CAIA NESSA!

A banca pode tentar confundir o candidato sobre o que a âncora seleciona. Note que a âncora filtra WHERE referencia IS NOT NULL, ou seja, só entram na recursão os processos que têm pai. Se houvesse um processo raiz (sem pai), ele não apareceria no resultado, a menos que fosse referenciado por outro.

  1. 1Âncora: referencia IS NOT NULL
  2. 2Recursão: JOIN com a CTE
  3. 3Projeção: subconsulta do pai
  4. 4DISTINCT + ORDER BY
LEVEL · soulevel.com.br

Item — ✅ Certo

A consulta está correta e produz o resultado esperado. A CTE recursiva percorre a hierarquia a partir dos processos com referencia não nula, e a subconsulta correlacionada preenche a descricao_pai. O DISTINCT e o ORDER BY garantem a saída organizada e sem duplicatas. A imagem apresentada reflete essa lógica para os dados hipotéticos, portanto o item está certo. Gabarito: Certo

Link permanente: /questoes/ce417356