SóProvas


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

Considere uma tabela de bancos de dados com dez registros, e apenas uma coluna cujos valores são 1, 2, 2, 3, 3, 3, 4, 4, 4, 4. Requisitado para remover os registros com valores repetidos dessa tabela, um programador produziu um script com dois comandos.

delete from exemplo
where exists (select * from exemplo e1
where exemplo.x = e1.x)
select count(distinct x) from exemplo

Na execução desse script, o número produzido no segundo comando foi:

Alternativas
Comentários
  • Toda a tabela será apagada, já que exemplo é igual a e1

  • O primeiro passo é rodar o primeiro comando:

    delete from exemplo where exists (select * from exemplo e1 where exemplo.x = e1.x)

    Agora temos que avaliar a subconsulta dentro do exists para saber quais serão os registros removidos da tabela exemplo, não é? 

    select * from exemplo e1 where exemplo.x = e1.x

    Perceba que a subquery utiliza a mesma tabela que o delete, a tabela exemplo, só dando o nome e1 para ela para fazer a correlação. Se observamos bem, a condição where exemplo.x = e1.x eventualmente será verdadeira para todos os registros de exemplo, já que exemplo e e1 são a mesma tabela!

    Assim, para todo registro de exemplo, sempre será retornado algum registro no exists, o que faz com que o delete remova o conteúdo da tabela por inteiro. Quando executarmos o comando a seguir:

    select count(distinct x) from exemplo

    Temos que o resultado inevitavelmente será zero, já que todos os registros da tabela foram removidos no passo anterior.

    Gabarito: A

  • O importante é que removeu as tuplas repetidas. :)

  • Questão bastante interessante. Lembremo-nos que a cláusula EXISTS retorna verdadeiro se uma tabela existir (óbvio né?!), desta forma, o que acontece é que ele não estabelece mais nenhuma condição, a não ser a existência da tabela e sendo assim, todos os dados serão apagados. Pois há repetição de números, logo a tabela existirá, resultando no valor verdadeiro retornado pela cláusula EXISTS.

    Por fim, ao realizar a contagem de elementos distintos na tabela, não encontraremos nenhum, pois o comando anterior apagou-a por completo.

    Em resumo, o primeiro comando deleta algo da tabela exemplo caso seja encontrado algum valor igual entre a própria tabela, ou seja, a condição sempre será verdadeira nesse caso.

  • O primeiro passo é rodar o primeiro comando:

    delete from exemplo where exists (select * from exemplo e1 where exemplo.x = e1.x)

    Agora temos que avaliar a subconsulta dentro do exists para saber quais serão os registros removidos da tabela exemplo, não é?

    select * from exemplo e1 where exemplo.x = e1.x

    Perceba que a subquery utiliza a mesma tabela que o delete, a tabela exemplo, só dando o nome e1 para ela para fazer a correlação.

    Se observamos bem, a condição where exemplo.x = e1.x eventualmente será verdadeira para todos os registros de exemplo, já que exemplo e e1 são a mesma tabela!

    Assim, para todo registro de exemplo, sempre será retornado algum registro no exists, o que faz com que o delete remova o conteúdo da tabela por inteiro.

    Quando executarmos o comando a seguir:

    select count(distinct x) from exemplo

    Temos que o resultado inevitavelmente será zero, já que todos os registros da tabela foram removidos no passo anterior.

  • valeu, samir