FC ConcursosFC Concursos

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?

  1. 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')

  2. 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'

  3. select mov.descricao, mov.data_movimentacao

    from tb_movimentacoes mov natural join tb_processos proc

    where proc.status='Arquivado'

  4. 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')

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

Continue aprendendo