Questão FC369435
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 apl
Linguagem SQL
FGV · 2025
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<FK>)
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_processos
Submeteu-se ao sistema que gerencia esse banco de dados relacional a consulta:
select mov.descricao, mov.data_movimentacao
from tb_movimentacoes mov
where exists
( select proc.id_processo from tb_processos proc
where proc.id_processo=mov.id_processo
and 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?
- select mov.descricao, mov.data_movimentacao
from tb_movimentacoes mov
where mov.id_processo in
(select proc.id_processo from tb_processos proc
where proc.status='Arquivado')
- select mov.descricao, mov.data_movimentacao
from tb_movimentacoes mov left join tb_processos proc
on proc.id_processo=mov.id_processo
where proc.status='Arquivado'
- select mov.descricao, mov.data_movimentacao
from tb_movimentacoes mov natural join tb_processos proc
where proc.status='Arquivado'
- select mov.descricao, mov.data_movimentacao
from tb_movimentacoes mov
where mov.id_processo any (select proc.id_processo from tb_processos proc
where proc.status='Arquivado')
- select mov.descricao, mov.data_movimentacao
from tb_movimentacoes mov
union
select proc.id_processo from tb_processos proc
where proc.status='Arquivado'
Mostrar resposta e comentário
Gabarito
Certo
Comentário do professor
A transformação apresentada substitui a subconsulta correlata por um join baseado em igualdade entre as tabelas. O uso de NATURAL JOIN faz a junção automática pelas colunas de mesmo nome — aqui, id_processo — o que corresponde ao predicado de correlação da subconsulta original.
Semânticamente, a cláusula EXISTS age como um semi-join: basta existir um processo com o mesmo id_processo e status='Arquivado'. Como id_processo é chave primária em tb_processos e também chave estrangeira em tb_movimentacoes, há no máximo um processo correspondente por movimentação, garantindo que o inner join (implementado pelo NATURAL JOIN) produza resultado equivalente sem duplicação indesejada.
Portanto, a consulta com NATURAL JOIN e o filtro proc.status='Arquivado' retorna exatamente as movimentações vinculadas a processos arquivados, implementando corretamente a técnica de desalinhamento da subconsulta correlata.
Conteúdo do catálogo FC Concursos · Atualizado em