SóProvas


ID
2486035
Banca
FGV
Órgão
IBGE
Ano
2017
Provas
Disciplina
Banco de Dados
Assuntos

Algumas consultas SQL podem ser escritas de mais de uma forma. Observe a consulta abaixo:


SELECT * FROM agro1 WHERE Ag1Regiao IN (SELECT Ag2Regiao FROM agro2);


Para obter o mesmo conjunto de resultado, essa consulta pode ser reescrita como:

Alternativas
Comentários
  • Apesar de não falar em SGBD específico, fiz o teste no Oracle. Não deu essa resposta. Se a tabela agro1  tiver valores repetidos, tipo 1,1,2,3, o IN não elimina esses valores. Ao contrário do DISTINCT que elimina na resposta.

     

  • Acabei de testar no MySql e assim como Rosana citou não houve eliminação de valores duplicados ao usar IN. A resposta da questão deveria ser a opção B. 

  • Em testes no Firebird funcionou, mas apenas se os atributos Ag1Regiao e Ag2Regiao não forem PK das respectivas tabelas, como a questão não mencionou se são chaves primárias a resposta é a opção A.

    Sem o distinct os registros apresentam duplicados.

  • Porque não pode ser a letra B ? Alguém explica por favor ?

     

    Grata!

  • A única diferença da A com a B é o DISTINCT que torna a A "mais correta". A instrução IN retorna os registros que possuem o mesmo valor em ambas tabelas de forma distinta. Como a alternativa B pode retornar resultados com valores idênticos o gabarito é a letra A.
  • A instrução IN não retorna os valores distintos. Observem a consulta original:

              SELECT * FROM agro1 WHERE Ag1Regiao IN (SELECT Ag2Regiao FROM agro2);

    O que faz essa consulta retornar os valores distintos não é o IN, e sim o SELECT * FROM agro1. Isso por si só garante que todas as tuplas retornadas são distintas, visto que uma relação não pode ter tuplas repetidas (a chave primária garante isso).

     

  • Acho que o Gabarito seria mesmo o B. Vide:

    http://sqlfiddle.com/#!9/2282b6/3/0

  • Gab A.

    Seja a tabela agro1(id, Ag1Regiao) com os valores:

    - (1, 1)

    - (2, 1)

    Seja a tabela agro2(id, Ag2Regiao) com os valores

    - (1, 1)

    - (2, 1)

    Resultado da A:

    - (1, 1)

    - (2, 1)

    Resultado da B:

    - (1, 1) -> correspondente ao agro2(1, 1)

    - (1, 1) -> correspondente ao agro2(2, 1)

    - (2, 1) -> correspondente ao agro2(1, 1)

    - (2, 1) -> correspondente ao agro2(2, 1)

  • Quem errou acertou e quem acertou errou. Parabéns, FGV!