Considere uma tabela relacional X com uma única coluna A, c...
------------- 1. delete from X where exists (select * from X x2 where x2.A = X.A)
2.
delete from X where not exists (select * from X x2 where x2.A = X.A) -------------
Nesse contexto, analise as afirmativas sobre os efeitos desses comandos.
I. Nenhuma linha seria deletada na execução do comando 1.
II. Uma linha seria deletada na execução do comando 1.
III. Nenhuma linha seria deletada na execução do comando 2.
IV. Uma linha seria deletada na execução do comando 2.
V. Os dois comandos gerariam erros de execução.
Está correto o que se afirma em
Gabarito comentado
Confira o gabarito comentado por um dos nossos professores
Alternativa correta: C - II e III, apenas.
Para resolver essa questão, é necessário compreender o funcionamento dos comandos DELETE em SQL e das cláusulas EXISTS e NOT EXISTS. O comando DELETE é usado para excluir linhas de uma tabela que satisfazem uma condição especificada, e EXISTS é utilizado para verificar a existência de linhas que atendem a um certo critério.
Analisando o comando 1:
DELETE FROM X WHERE EXISTS (SELECT * FROM X x2 WHERE x2.A = X.A)
Como a tabela X contém apenas uma linha, a subconsulta (SELECT * FROM X x2 WHERE x2.A = X.A) retornará verdadeiro para a linha existente, pois ela satisfaz a condição de que existe uma linha na tabela com a mesma coluna A. Portanto, a linha será excluída.
Portanto, a afirmativa II, que diz que uma linha seria deletada na execução do comando 1, é verdadeira.
Em seguida, analisando o comando 2:
DELETE FROM X WHERE NOT EXISTS (SELECT * FROM X x2 WHERE x2.A = X.A)
Novamente, tendo em vista que a tabela X tem apenas uma linha, a subconsulta sempre encontrará a linha onde x2.A = X.A, tornando a condição NOT EXISTS falsa. Logo, nenhuma linha será deletada porque a condição para a deleção nunca será satisfeita.
Portanto, a afirmativa III, que diz que nenhuma linha seria deletada na execução do comando 2, é verdadeira.
Com base na análise dos comandos e das afirmativas, concluímos que as afirmações II e III são verdadeiras, fazendo da alternativa C a correta.
As outras afirmativas são falsas: a afirmativa I é falsa porque uma linha seria deletada no comando 1, assim como a afirmativa IV é falsa porque nenhuma linha seria deletada no comando 2. A afirmativa V também é falsa, pois os comandos não gerariam erros de execução, eles simplesmente teriam efeitos diferentes conforme explicado.
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
A cláusula EXISTS retorna verdadeiro, caso a subquery satisfaça, pelo menos, uma condição.
Por outro lado a NOT EXISTS retorna verdadeiro, caso a subquery não satisfaça nenhuma condição.
--
O enunciado disse que a tabela tem um coluna com apenas uma linha.
--
O 1º comando compara as colunas "A" da tabela "X" e da "X.2", que, na verdade, são as mesmas tabelas. Lembra que o enunciado disse que a coluna "A" só tem uma linha? Então, se as tabelas são iguais, as colunas também são, assim como as linhas. Se são iguais, a subquery retorna um valor.
Se a subquery satisfez a condição, então, isso significa que um resultado foi encontrado. Nesse caso, o EXISTS retorna verdadeiro para a execução do comando que vem antes. Assim, a linha será deletada.
--
Com relação ao 2º comando, é quase a mesma coisa. A diferença é que a subquery satisfaz uma condição, ou seja, encontra o resultado e, no caso do NOT EXISTS, quando um resultado é encontrado, ela retorna FALSO. Se retornou falso, então o que vai antes não será executado. Assim, nenhuma linha será deletada.
--
GAB.: LETRA "C".
1ª comando - apenas uma será excluída, pois a tabela só tem 1 linha.
2ª comando - NOT EXISTS só retorna true se o teste der falso .
Clique para visualizar este comentário
Visualize os comentários desta questão clicando no botão abaixo