Considere um banco de dados com uma tabela R1, com atributos...
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.
Gabarito comentado
Confira o gabarito comentado por um dos nossos professores
Alternativa correta: C - O terceiro.
Para resolver essa questão, é preciso entender o funcionamento de consultas SQL que envolvem comparações entre duas tabelas. Especificamente, o enunciado solicita uma consulta para retornar registros da tabela R1 que não possuem correspondentes na tabela R2 baseado na igualdade dos valores do atributo A em ambas as tabelas.
As opções apresentam diferentes métodos para alcançar o resultado desejado. Vamos entender por que a Alternativa C é a correta e, portanto, não produz o resultado esperado:
SELECT r1.* FROM r1 INNER JOIN r2 ON r1.A <> r2.A;
A consulta acima utiliza um INNER JOIN com a condição de que os valores de A são diferentes (<>) entre as tabelas R1 e R2. Contudo, isso não satisfaz a requisição do enunciado. Ao invés de retornar registros de R1 que não possuem correspondência em R2, o INNER JOIN com essa condição retornaria registros que existem em ambas as tabelas mas com valores diferentes em A. Isso pode incluir registros de R1 que também tenham correspondentes em R2 com valores de A iguais, o que está fora do que foi solicitado.
As outras alternativas utilizam métodos como NOT IN, NOT EXISTS, e subconsultas com count(*) ou INTERSECT, todos projetados para identificar de forma correta os registros exclusivos da tabela R1 que não têm correspondentes em R2 com base na igualdade do atributo A. Portanto, essas consultas atendem ao pedido feito no enunciado da questão.
Compreender as diferentes maneiras de realizar comparações e junções entre tabelas em SQL é essencial para trabalhar com bancos de dados e especialmente importante para questões de concurso público que abordam o tema de Banco de Dados - SQL.
Clique para visualizar este gabarito
Visualize o gabarito desta questão clicando no botão abaixo
Comentários
Veja os comentários dos nossos alunos
Não entrando em maiores detalhes...
O ponto chave para a questão é " tal que os valores dos atributos A em cada tabela tenham o mesmo valor."
Observem a condição de associação do terceiro comando "on r1.A <> r2.A;" leia-se "em que os valores da R1.A são diferentes da R2.A", ou seja, contrariando o enunciando, portanto NÃO PRODUZIRÁ O RESULTADO PEDIDO DA QUESTÃO.
GABARITO ALTERNATIVA C
Questão passiva de anulação.
Sobre a letra (C).
.
Supondo que ambos T1 e T2 possuam 5 registros e a coluna "A" de ambos variam de 1 a 5.
Nessa situação, o correto é retornar 0 registros haja vista que todo valor de T1 possui correspondência em T2.
No entanto, o JOIN da letra C irá fazer o produto cartesiano (5x5=25) excluindo as combinações idênticas de A (1-1, 2-2, 3-3, 4-4, 5-5), retornando 20 registros.
http://sqlfiddle.com/#!17/309b07/12
O comando que não produz o resultado corretamente é o terceiro:
select r1.* from r1 inner join r2 on r1.A <> r2.A;
Esse comando retornaria registros de R1 que têm valores de A diferentes de todos os valores de A em R2, o que não corresponde ao que é pedido na pergunta. O correto seria fazer um join usando a igualdade entre A em ambas as tabelas, em vez de desigualdade:
select r1.* from r1 left join r2 on r1.A = r2.A where r2.A is null;
Este comando retornaria os registros de R1 que não têm um registro correspondente em R2. Os outros comandos estão corretos.
Clique para visualizar este comentário
Visualize os comentários desta questão clicando no botão abaixo