João tem pouca experiência com SQL, mas precisa de uma cons...

Próximas questões
Com base no mesmo assunto
Q2447895 Banco de Dados
Quando referenciadas, considere as tabelas relacionais Competidor e Disputa, cujas estruturas e instâncias são descritas abaixo. Todas as colunas são definidas como strings.


A tabela Disputa contém as disputas realizadas entre competidores que aparecem na tabela Competidor. Em cada disputa há dois competidores, um com camisa azul e outro com camisa verde.



João tem pouca experiência com SQL, mas precisa de uma consulta que exiba os competidores que têm o mesmo número de disputas com as camisas azul e verde. João escreveu três scripts, utilizando as tabelas Competidor e Disputa, como definidas anteriormente, e tentou a sorte. 

Imagem associada para resolução da questão


Dado que a resposta correta deve exibir somente o competidor B, conclui-se que:
Alternativas

Gabarito comentado

Confira o gabarito comentado por um dos nossos professores

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

A primeira query está errada pois aquele HAVING na verdade não está filtrando nada.

having count(distinct d.azul) = count(distinct d.verde), como existem 4 registros diferentes na coluna d.azul e 4 registros diferentes na d.verde, essa condição é a mesma coisa que having 4 = 4, logo todas as linhas serão retornadas pois todas vão atender essa condição.

Já a terceira query tá com erro de sintaxe naquele subselect.

select sum(1) where d.azul = c.nome



A segunda query está certinha, ela só retorna o registro se o número de vezes que ele apareceu em d.azul for igual ao numero de vezes que ele apareceu em d.verde

Então letra C é a alternativa certa.

Não manjo muito de linguagem SQL marquei a primeira por causa do count e imaginei que ele queria contar

O que acontece é que quando temos uma query como FROM Competidor c, Disputa d, ao invés de fazer a contagem nas linha de Competidor apenas, ele faz a contagem no produto cartesiano das duas tabelas. Isso gera um resultado em que se contam 6 vezes diferentes o mesmo resultado (o número de linhas de disputa), resultando em número muito acima do que teríamos usando apenas FROM Competidor c

Para determinar qual dos scripts fornecidos produz o resultado correto (apenas o competidor B), precisamos analisar cada um deles com base nas tabelas fornecidas:

O primeiro script tenta agrupar e contar as disputas por competidor, mas a sintaxe está incorreta porque falta uma condição de junção entre as tabelas Competidor e Disputa. Além disso, o uso de distinct nas colunas de disputa não é aplicado corretamente para verificar se um competidor tem o mesmo número de vezes como azul e verde.

O segundo script usa subconsultas para contar as ocorrências de cada competidor como azul e como verde, comparando esses valores. Este é um método válido para alcançar o resultado desejado, assumindo que o ambiente SQL permita comparações entre subconsultas sem especificar uma função de agregação explícita.

O terceiro script é semelhante ao segundo, mas está incorreto porque não possui a cláusula FROM nas subconsultas, tornando a sintaxe inválida.

Portanto, a resposta correta é que somente o segundo script funciona.

Clique para visualizar este comentário

Visualize os comentários desta questão clicando no botão abaixo