Questão nº 67

Questão de Administração de Banco de Dados · FGV MPAL 2018 (nº 67)

FGV2018Analista do Ministério Público - Administrador de Banco de DadosAdministração de Banco de Dados
Gabarito: Cver comentário ↓

Considere um banco de dados com uma tabela R1, com atributos A e B, e outra, R2, com atributos A e C.

Sobre elas é preciso preparar uma consulta que retorna os registros de R1 que não têm um registro correspondente em R2, tal que os valores dos atributos A em cada tabela tenham o mesmo valor.

Foram preparados cinco comandos para tal fim, a saber.

select r1.* from r1
where r1.A not in ( select r2.A from r2 );

select r1.* from r1
where not exists ( select * from r2
                   where r2.A = r1.A );

select r1.* from r1 inner join r2
                    on r1.A <> r2.A;

select r1.* from r1
where ( select count(*) from r2
        where r2.A=r1.A ) = 0;

select r1.* from r1
where r1.A not in
         ( select A
           from ( select A from r1
                  intersect
                  select A from r2) x );

Considerando um banco de dados no MS SQL Server ou no Oracle, assinale a opção que indica o comando que não produz esse resultado corretamente.

Resposta comentada

Gabarito Alternativa C

Para encontrar registros em uma tabela que não têm correspondência em outra tabela com base em um valor comum, utilizamos técnicas de anti-join. Isso significa identificar linhas em uma tabela que não possuem um valor correspondente na coluna especificada da segunda tabela.

  • (A) Incorreta: Esta consulta utiliza NOT IN. Ela seleciona registros de r1 cujo valor de A não está presente no conjunto de valores A de r2. Se a coluna r2.A for definida como NOT NULL (sem valores nulos), esta consulta funciona corretamente. No contexto da questão, onde apenas uma alternativa está incorreta, assume-se que r2.A não contém NULLs, tornando-a uma solução válida.
  • (B) Incorreta: Esta consulta utiliza NOT EXISTS, que é a forma mais robusta e recomendada para realizar um anti-join. Ela verifica, para cada registro de r1, se não existe nenhum registro correspondente em r2 com o mesmo valor de A. Lida corretamente com valores NULL e é sempre uma solução válida para o problema.
  • (C) Correta: Esta consulta usa um INNER JOIN com a condição r1.A <> r2.A. Um INNER JOIN retorna apenas as linhas onde a condição de junção é verdadeira. Neste caso, ele retornaria registros de r1 que têm uma correspondência em r2 onde os valores de A são diferentes. Ele falha completamente em identificar registros de r1 que não têm nenhuma correspondência em r2, e pode retornar múltiplos registros ou registros que de fato possuem uma correspondência exata (mas também possuem outras correspondências diferentes). Esta é a armadilha da banca, pois INNER JOIN com NOT EQUAL não é um anti-join e não resolve o problema proposto.
  • (D) Incorreta: Esta consulta utiliza uma subconsulta correlacionada para contar o número de registros em r2 que correspondem a r1.A. Se a contagem for igual a zero, significa que não há correspondência em r2 para aquele r1.A. Esta é uma forma correta e funcional de realizar o anti-join.
  • (E) Incorreta: Esta consulta utiliza INTERSECT para encontrar os valores de A que são comuns a ambas as tabelas (r1 e r2). Em seguida, usa NOT IN para selecionar registros de r1 cujo A não está nesse conjunto de valores comuns. Se as colunas A envolvidas não contiverem valores NULL, esta abordagem é correta. No contexto da questão, onde apenas uma alternativa está incorreta, assume-se que não há NULLs que comprometam o NOT IN, tornando-a uma solução válida.

Fonte: FGV MPAL 2018 Analista do Ministério Público - Administrador de Banco de Dados (Caderno Tipo 1). Reproduzida para fins de estudo.

Continue estudando

Estudar é izi

Pratique milhares de questões como esta, de graça, com explicação e gamificação no Quizinho.

Estudar de graça no Quizinho