Questão nº 41
Questão de Tecnologia da Informação · FGV TJ-AP 2024 (nº 41)
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.
select distinct c.nome
from Competidor c, Disputa d
group by c.nome
having count(distinct d.azul)
= count(distinct d.verde)
select c.nome
from Competidor c
where (select sum(1)
from Disputa d where d.azul = c.nome)
= (select sum(1)
from Disputa d where d.verde = c.nome)
select distinct c.nome
from Competidor c, Disputa d
where (select sum(1) where d.azul = c.nome)
= (select sum(1) where d.verde = c.nome)
Dado que a resposta correta deve exibir somente o competidor B, conclui-se que:
- Anenhum dos scripts funciona;
- Bsomente o primeiro script funciona;
- Csomente o segundo script funciona; (alternativa correta)
- Dsomente o terceiro script funciona;
- Eos três scripts funcionam.
Resposta comentada
Gabarito Alternativa C
Para resolver este problema, precisamos entender como as consultas SQL contam ocorrências e como as subconsultas correlacionadas permitem que uma consulta interna use valores da consulta externa para realizar cálculos específicos para cada linha.
- Competidor A: 2 disputas como azul (A,B; A,C), 1 disputa como verde (D,A).
- Competidor B: 2 disputas como azul (B,C; B,D), 1 disputa como verde (A,B).
- Competidor C: 1 disputa como azul (C,D), 2 disputas como verde (A,C; B,C).
- Competidor D: 1 disputa como azul (D,A), 2 disputas como verde (B,D; C,D).
Com os dados fornecidos, nenhum competidor tem o mesmo número de disputas como azul e verde. No entanto, a questão afirma que a resposta correta deve ser o competidor B. Isso significa que devemos avaliar qual script implementa corretamente a lógica para encontrar tal competidor, mesmo que os dados de exemplo não produzam B.
- (A) Incorreta: O primeiro e o terceiro scripts estão incorretos em sua lógica, como explicado abaixo.
- (B) Incorreta: O primeiro script não funciona corretamente, pois sua lógica de contagem está equivocada devido ao
CROSS JOINe ao uso deCOUNT(DISTINCT ...). - (C) Correta: Este script utiliza subconsultas correlacionadas para cada competidor. Para cada
c.nomeda tabelaCompetidor, a primeira subconsulta (select sum(1) from Disputa d where d.azul = c.nome) conta corretamente quantas vezes o competidorc.nomeaparece na colunaazulda tabelaDisputa. A segunda subconsulta faz o mesmo para a colunaverde. A cláusulaWHEREentão compara esses dois contadores. Esta é a abordagem lógica correta para resolver o problema, mesmo que com os dados de exemplo fornecidos, ela não retorne 'B' (retornaria nenhum resultado, pois nenhum competidor tem contagens iguais). Se houvesse dados onde 'B' tivesse 2 disputas como azul e 2 como verde, este script o identificaria corretamente. - (D) Incorreta: O terceiro script está incorreto. O
FROM Competidor c, Disputa dcria umCROSS JOIN(produto cartesiano). As subconsultas(select sum(1) where d.azul = c.nome)são avaliadas para cada linha doCROSS JOIN. Sem uma cláusulaFROMdentro da subconsulta,sum(1)retorna 1 se a condição for verdadeira para a linha atual doCROSS JOIN, ouNULL(ou 0) se falsa. A comparaçãoNULL = NULLem SQL éUNKNOWN(tratado como falso emWHERE), e a condição1 = 1só ocorreria se o competidor jogasse contra si mesmo na mesma disputa (d.azul = c.nomeEd.verde = c.nome), o que não acontece. Portanto, este script não retorna resultados válidos. - (E) Incorreta: Apenas o segundo script implementa a lógica correta para o problema.
Fonte: FGV TJ-AP 2024 Analista Judiciário - TI - Desenvolvimento de Sistemas (Caderno Tipo 1). Reproduzida para fins de estudo.
