← Questões de Banco de Dados

Banco de Dados · FGV · 2023

Questão comentada de Banco de Dados

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 é:

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.

Continue treinando

Questões relacionadas