Considere o comando SQL a seguir, executado num banco de dados relacional com duas tabelas, R1 e R2, contendo 2.000 e 5.000 registros, respectivamente. R1 e R2 possuem chaves primárias definidas. SELECT DISTINCT * FROM A, B Assinale o número de linhas produzidas na execução.
- A)1
Errada: 1 linha só ocorreria se a consulta retornasse um único registro, o que não acontece em uma junção cartesiana entre milhares de linhas.
- B)2.000
Errada: 2.000 seria o tamanho de apenas uma das tabelas, mas aqui o comando combina A com B, multiplicando as linhas.
- C)5.000
Errada: 5.000 é apenas a quantidade de registros da outra tabela, e não o total produzido pela multiplicação entre as duas.
- D)7.000
Errada: 7.000 é uma soma simples, mas o comando não soma tabelas; ele faz produto cartesiano.
- E)10.000.000
Certa: `FROM A, B` gera 2.000 x 5.000 combinações, e o `DISTINCT` não reduz o resultado porque não há linhas repetidas.
Gabarito: E
Aqui o ponto-chave é lembrar que, em SQL, escrever `FROM A, B` sem condição de junção gera uma junção cartesiana. Isso significa que cada linha de A combina com cada linha de B. Como A tem 2.000 registros e B tem 5.000, o resultado bruto tem 2.000 x 5.000 = 10.000.000 linhas. O `DISTINCT` não muda esse total neste caso, porque ele elimina linhas repetidas, e aqui cada combinação entre uma linha de A e uma de B é diferente. Como as tabelas têm chaves primárias, cada registro é identificável de forma única, então não há duplicação a ser removida entre as combinações formadas. Em outras palavras: primeiro vem o produto cartesiano, depois o `DISTINCT` tenta limpar duplicatas. Só que não tem duplicata para limpar. Por isso o resultado continua com 10 milhões de linhas. Esse é um clássico de prova da FGV: ela adora testar se você enxerga que vírgula no `FROM` é junção cartesiana e que `DISTINCT` não faz mágica, só remove repetidos. Resultado final: 10.000.000 linhas.