Pular para o conteúdo principal

Questão de Banco de Dados — SQL — FGV 2025

Banco de DadosSQL
Código
fg109088
Banca
FGV
Órgão
DPE-RO
Ano
2025
Nível
Médio
Cargo
Técnico em Informática - Classe A
Seja o seguinte esquema relacional de banco de dados: tb_processos(id_processo, numero_processo, tipo, status, data_abertura)Restrições:• id_processo é chave primária• numero_processo não pode ser nulo• tipo pode assumir os valores {"Ação de Alimentos", "Defesa Criminal"}.• status pode assumir os valores {"Em andamento", "Arquivado", "Sentenciado"}tb_movimentacoes(id_movimentacao, descricao,data_movimentacao, id_processo)Restrições:• id_movimentacao é chave primária• descricao não pode ser nulo • descricao pode assumir os valores { "Petição inicial protocolada", "Audiência realizada"}.• id_processo é chave estrangeira e referencia a tabela tb_processosSubmeteu-se ao sistema que gerencia esse banco de dados relacional a consulta:select mov.descricao, mov.data_movimentacaofrom tb_movimentacoes movwhere exists( select proc.id_processo from tb_processos procwhere proc.id_processo=mov.id_processoand proc.status='Arquivado' )O otimizador de consultas do sistema, ao avaliar a consulta, identificou tratar-se de um caso de consulta correlata, com uma subconsulta aninhada referenciando um elemento de dado da consulta externa.Considerando que o otimizador decidiu e é capaz de implementar a melhor opção de otimização, qual das opções apresenta uma consulta equivalente à anteriormente proposta, após a aplicação da técnica de desalinhamento?
  1. Aselect mov.descricao, mov.data_movimentacaofrom tb_movimentacoes movwhere mov.id_processo in(select proc.id_processo from tb_processos procwhere proc.status='Arquivado')
  2. Bselect mov.descricao, mov.data_movimentacao from tb_movimentacoes mov left join tb_processos procon proc.id_processo=mov.id_processowhere proc.status='Arquivado'
  3. Cselect mov.descricao, mov.data_movimentacaofrom tb_movimentacoes mov natural join tb_processos procwhere proc.status='Arquivado'
  4. Dselect mov.descricao, mov.data_movimentacaofrom tb_movimentacoes movwhere mov.id_processo any(select proc.id_processo from tb_processos procwhere proc.status='Arquivado')
  5. Eselect mov.descricao, mov.data_movimentacaofrom tb_movimentacoes movunionselect proc.id_processo from tb_processos procwhere proc.status='Arquivado
Revelar gabarito e comentário

GabaritoC — select mov.descricao, mov.data_movimentacao from tb_movimentacoes mov natural join tb_processos proc where proc.status='Arquivado'

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”.

Desaninhamento de subconsulta correlacionada: equivalente JOIN

Gabarito: letra C. A técnica de desalinhamento (flattening) transforma a subconsulta correlacionada com EXISTS em uma junção; o NATURAL JOIN é a forma direta de fazê-lo, mantendo a equivalência semântica. A consulta original retorna movimentações cujo processo está arquivado; o NATURAL JOIN entre tb_movimentacoes e tb_processos por id_processo, filtrado por status='Arquivado', produz exatamente essas linhas.

Alternativa A — ❌ Incorreta

Ainda utiliza subconsulta (IN), embora não correlacionada. Não é a aplicação da técnica de desalinhamento, que visa substituir a subconsulta por junção.

Alternativa B — ❌ Incorreta

LEFT JOIN com WHERE na tabela da direita equivale a um INNER JOIN, mas o LEFT JOIN é desnecessário e pode ser menos eficiente que um INNER JOIN direto. A técnica de desalinhamento geralmente produz um INNER JOIN simples.

Alternativa C — ✅ Correta ⟵ GABARITO

NATURAL JOIN realiza a junção pela coluna comum id_processo e, com o filtro WHERE, equivale exatamente à consulta original. É a transformação mais natural e eficiente.

Alternativa D — ❌ Incorreta

ANY com subconsulta tem sintaxe não padrão (normalmente = ANY) e ainda mantém a subconsulta, não implementando o desalinhamento.

Alternativa E — ❌ Incorreta

UNION combina duas consultas com colunas diferentes (descricao/data_movimentacao vs id_processo), o que é semanticamente incorreto e não retorna o mesmo resultado.

PEGA ESSA DICA!

A técnica de desalinhamento (subquery flattening) é uma otimização comum que converte subconsultas correlacionadas em junções. Na prova, lembre que EXISTS e IN podem ser reescritos com INNER JOIN, desde que não haja valores NULL envolvidos. O NATURAL JOIN é uma forma concisa, mas cuidado com colunas homônimas não desejadas.

Gabarito: letra C.

Link permanente: /questoes/fg109088