Considere uma tabela relacional X com uma única coluna A, cuja instância contém uma linha apenas, e os comandos SQL a seguir. ------------- 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
- A)I e III, apenas.
Errada, porque o comando 1 apaga a única linha, então a afirmativa I falha.
- B)I e IV, apenas.
Errada, porque o comando 1 não preserva a linha; ele a exclui, então I está errada.
- C)II e III, apenas.
Correta, porque o comando 1 deleta uma linha e o comando 2 não deleta nenhuma.
- D)II e IV, apenas.
Errada, porque o comando 2 não apaga a linha existente; ele só apagaria se a subconsulta não encontrasse correspondência.
- E)V, apenas.
Errada, porque a consulta correlacionada com a própria tabela não gera erro por si só; ela apenas avalia EXISTS e NOT EXISTS normalmente.
Gabarito: C
A questão explora subconsulta correlacionada com EXISTS e NOT EXISTS. O truque aqui é simples: a subconsulta olha para a própria tabela X e compara o valor da coluna A da linha “em análise” com as linhas internas da mesma tabela. Como a tabela tem apenas uma linha, essa linha sempre encontra ela mesma no comando 1, então EXISTS fica verdadeiro e o registro é apagado. No comando 2 acontece o inverso. Se a linha existe na tabela, a subconsulta também a encontra, então NOT EXISTS fica falso. Resultado: nada é deletado. Em outras palavras, o primeiro comando elimina a única linha; o segundo não elimina nenhuma. Isso bate com a lógica padrão de SQL ensinada em teoria e cobrada em prova: EXISTS verifica se a subconsulta retorna ao menos uma linha, e NOT EXISTS verifica a ausência de linhas retornadas. Não há motivo para erro de execução apenas por a tabela ser a mesma na consulta externa e interna. O banco trata isso como subconsulta correlacionada normal. Por isso o gabarito é a letra C: a afirmativa II é verdadeira, pois uma linha seria deletada no comando 1, e a afirmativa III é verdadeira, pois nenhuma linha seria deletada no comando 2.