Questão nº 67
Questão de Administração de Banco de Dados · FGV MPAL 2018 (nº 67)
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.
- AO primeiro.
- BO segundo.
- CO terceiro. (alternativa correta)
- DO quarto.
- EO quinto.
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 der1cujo valor deAnão está presente no conjunto de valoresAder2. Se a colunar2.Afor definida comoNOT NULL(sem valores nulos), esta consulta funciona corretamente. No contexto da questão, onde apenas uma alternativa está incorreta, assume-se quer2.Anão contémNULLs, 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 der1, se não existe nenhum registro correspondente emr2com o mesmo valor deA. Lida corretamente com valoresNULLe é sempre uma solução válida para o problema. - (C) Correta: Esta consulta usa um
INNER JOINcom a condiçãor1.A <> r2.A. UmINNER JOINretorna apenas as linhas onde a condição de junção é verdadeira. Neste caso, ele retornaria registros der1que têm uma correspondência emr2onde os valores deAsão diferentes. Ele falha completamente em identificar registros der1que não têm nenhuma correspondência emr2, 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, poisINNER JOINcomNOT EQUALnã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
r2que correspondem ar1.A. Se a contagem for igual a zero, significa que não há correspondência emr2para aqueler1.A. Esta é uma forma correta e funcional de realizar o anti-join. - (E) Incorreta: Esta consulta utiliza
INTERSECTpara encontrar os valores deAque são comuns a ambas as tabelas (r1er2). Em seguida, usaNOT INpara selecionar registros der1cujoAnão está nesse conjunto de valores comuns. Se as colunasAenvolvidas não contiverem valoresNULL, esta abordagem é correta. No contexto da questão, onde apenas uma alternativa está incorreta, assume-se que não háNULLs que comprometam oNOT 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.