Considere uma tabela relacional TAB, com colunas A e B. A coluna A constitui a chave primária de TAB. A instância de TAB contém 100 linhas, e em todas as linhas o valor da coluna B é 10. Nesse contexto, analise o comando SQL a seguir. select * from TAB t where not exists (select * from TAB tt where t . B = tt . B and t . A > tt . A) Além da linha de títulos, o número de linhas produzidas pelo comando acima é:
- A)0;
Errada: a consulta não elimina todas as linhas, porque a linha de menor A não encontra nenhuma outra com A menor.
- B)1;
Certa: apenas a linha com o menor valor de A satisfaz o NOT EXISTS, já que não há registro com B = 10 e A menor.
- C)98;
Errada: 98 pressupõe que duas linhas escapariam do filtro, mas só uma linha fica sem antecessor.
- D)99;
Errada: 99 seria o total de linhas restantes menos uma, mas a subconsulta elimina todas as demais linhas.
- E)100.
Errada: a condição NOT EXISTS não preserva todas as linhas, pois quase todas têm pelo menos uma linha correlata com A menor.
Gabarito: B
A ideia central aqui é olhar para a subconsulta correlacionada com calma. O comando seleciona as linhas de TAB para as quais não existe outra linha com o mesmo valor de B e com A menor. Como todas as 100 linhas têm B = 10, a condição t.B = tt.B sempre será verdadeira entre quaisquer duas linhas, então sobra só a comparação entre os valores de A. Como A é chave primária, cada valor de A é único. Assim, para a linha que tem o menor A da tabela, não existe nenhuma outra linha com A menor. Para qualquer outra linha, sempre existe pelo menos uma linha com A menor, então a subconsulta encontra resultado e o NOT EXISTS falha. Resultado prático: sobra apenas uma linha, a de menor valor de A. É uma forma clássica de usar NOT EXISTS para achar o "primeiro" elemento de um conjunto, isto é, a linha sem antecessor segundo a ordenação implícita por A. Por isso, o gabarito é B. Não é sobre contar 100 linhas nem 99 linhas, porque a existência de uma linha com A menor elimina quase todas as tuplas da consulta.