delete from T2 ...
Na questão, considere as tabelas T1 e T2 exibidas a seguir com suas respectivas instâncias.
T1 T2
a b a c
10 A 10 7
11 B 11 9
12 C 15 NULL
14 D
delete from T2
where
not exists
(select * from T1
where t1 . a = t2 . a)
No contexto das tabelas T1 e T2 definidas acima, a execução do
comando SQL que, eventualmente, remove as linhas, é correto
afirmar que
Gabarito comentado
Confira o gabarito comentado por um dos nossos professores
Alternativa correta: D - somente a terceira será removida.
Para resolver esta questão, é essencial compreender a operação do comando DELETE em conjunto com a cláusula NOT EXISTS em SQL. Esta operação é utilizada para excluir registros de uma tabela (T2) com base na existência, ou não, de registros correspondentes em outra tabela (T1).
O subcomando NOT EXISTS é utilizado para verificar se uma subconsulta retorna alguma linha. Se a subconsulta não retornar linhas, a condição NOT EXISTS é verdadeira, e o DELETE é executado. Neste caso, a subconsulta compara a coluna a de ambas as tabelas T1 e T2 para determinar se um registro em T2 tem uma correspondência em T1.
Analisando os dados fornecidos, temos:
- Registro T2 (10, 7): Tem correspondente em T1 (10, A), portanto, NÃO será excluído.
- Registro T2 (11, 9): Tem correspondente em T1 (11, B), portanto, NÃO será excluído.
- Registro T2 (15, NULL): NÃO tem correspondente em T1, uma vez que não existe um registro em T1 com a = 15. Portanto, SERÁ excluído.
Assim, a única linha removida será a terceira linha da tabela T2, que corresponde ao registro (15, NULL), visto que este não possui um registro correspondente na tabela T1.
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
Creio que seja um subselect ou subconsulta, o not exists é usado para subtrair um conjunto de dados de outro, ele encontra o primeiro resultado, validar e passar para o próximo registro.
No caso ele pede para deletar uma linha da tabela T2 onde o valor não consta na T1. Ele passa como parâmetro a T2 na T1.
Gabarito: D
A ideia é remover todos aqueles registros para os quais a subquery fornecida não retorna nada.
Para cada registro de T2, precisamos avaliar a seguinte expressão:
select * from T1 where t1.a = t2.a
Então observe que, para um dado registro de T2, se houver algum registro de T1 em que o valor de a é igual ao valor de a em T2, a consulta irá retornar esse registro.
Acontecendo isso, a expressão not exists retornará falso e o registro não será removido.
Então somente aqueles registros cujo valor de T2.a não existe em T1.a é que serão eliminados, no caso somente o terceiro registro, composto por {a = 15, b = NULL}.
tab t2 3 tupla removida.
se fosse delete from T1, seriam somente a primeira e a segunda serão removidas.
not exists procura valores distintos
Clique para visualizar este comentário
Visualize os comentários desta questão clicando no botão abaixo