SóProvas


ID
2699362
Banca
FGV
Órgão
Banestes
Ano
2018
Provas
Disciplina
Banco de Dados
Assuntos

Considere um banco de dados com duas tabelas. A primeira tabela, números, possui dez registros e apenas uma coluna, cujos valores são 1, 2, 3, 4, 5, 5, 9, 9, 9, 10. A segunda tabela, denominada teste, com cinco registros, também possui apenas uma coluna, cujos valores são 1, 3, 3, 4, 5.

Considere ainda o seguinte comando SQL

insert into teste
select numero from numeros n
where not exists
(select * from teste t
where t.numero = n.numero)

Quando da execução desse comando, o número de registros inseridos na tabela teste é:

Alternativas
Comentários
  • Alternativa c)

    Simplesmente ele comparar os números diferentes que tem na tabela numeros e não está na tabela teste (where not exists). 

    Sobrando apenas os números 2,9,9,9  e 10 => 5

  • A consulta fica um pouco confusa quando lida dessa maneira, não é? É melhor separar o comando em linhas:

    insert into teste

    select numero from numeros n

    where not exists (select * from teste t where t.numero = n.numero)

    Veja que iremos inserir na tabela teste os valores do atributo numero da tabela números, para os quais não são retornados registros para a subquery em questão, já que é usado o comando NOT EXISTS.

              select * from teste t where t.numero = n.numero

    Dessa consulta, podemos entender que a ideia é inserir em teste todos os valores da tabela números que ainda não existem em teste.

    Assim, temos que os valores em destaque a seguir serão inseridos em teste: 1, 2, 3, 4, 5, 5, 9, 9, 9, 10.

    Repare que o valor 9 será inserido 3 vezes, isso porque a avaliação da subquery ocorre uma só vez, antes da inserção do novo conjunto de valores ser realizada. No momento em que o NOT EXISTS é avaliado, todas as ocorrências de 9 satisfazem ao comando, já que ainda não existe nenhum valor igual na tabela teste.

    Se essa conferência fosse feita de forma sequencial, uma vez após cada inserção, o número 9 iria entrar só uma vez, pois após a primeira inserção de um valor 9, o NOT EXISTS iria parar de retornar verdadeiro. Contudo, como esse não é o caso, temos a inserção de 5 valores em teste: 2, 9, 9, 9 e 10.

    Gabarito: C

  • A consulta fica um pouco confusa quando lida dessa maneira, não é?

    É melhor separar o comando em linhas:

    insert into teste

    select numero from numeros n

    where not exists (select * from teste t where t.numero = n.numero)

    Veja que iremos inserir na tabela teste os valores do atributo numero da tabela números, para os quais não são retornados registros para a subquery em questão, já que é usado o comando NOT EXISTS.

    select * from teste t where t.numero = n.numero

    Dessa consulta, podemos entender que a ideia é inserir em teste todos os valores da tabela números que ainda não existem em teste.

    Assim, temos que os valores em destaque a seguir serão inseridos em teste: 1, 2, 3, 4, 5, 5, 9, 9, 9, 10.

    Repare que o valor 9 será inserido 3 vezes, isso porque a avaliação da subquery ocorre uma só vez, antes da inserção do novo conjunto de valores ser realizada.

    No momento em que o NOT EXISTS é avaliado, todas as ocorrências de 9 satisfazem ao comando, já que ainda não existe nenhum valor igual na tabela teste.

    Se essa conferência fosse feita de forma sequencial, uma vez após cada inserção, o número 9 iria entrar só uma vez, pois após a primeira inserção de um valor 9, o NOT EXISTS iria parar de retornar verdadeiro. Contudo, como esse não é o caso, temos a inserção de 5 valores em teste: 2, 9, 9, 9 e 10.

  • Como saber q a clásula "exists" é booleano ou não?