Questão de Banco de Dados — SQL — Quadrix 2025
- Código
- qg599041
- Banca
- Quadrix
- Órgão
- CRMV-GO
- Ano
- 2025
- Nível
- Superior
- Cargo
- Analista Administrativo
- CCerto
- EErrado
GabaritoE — Errado
Gabarito: ERRADO (letra E). O comando apresentado não retorna os veterinários que realizaram atendimentos em todas as cidades cadastradas na tabela CLINICA, pois a subconsulta apenas verifica se o veterinário realizou pelo menos um atendimento em qualquer cidade, sem qualquer agrupamento ou comparação com o total de cidades. Para responder corretamente à pergunta, seria necessário usar uma consulta com GROUP BY e HAVING COUNT(DISTINCT ...) = (SELECT COUNT(*) FROM CLINICA).
O cerne da questão está na diferença entre os quantificadores lógicos "existe" (∃) e "para todo" (∀). A consulta com IN implementa o quantificador existencial: ela retorna os veterinários para os quais existe um atendimento em alguma cidade. Já a expressão "em todas as cidades" exige o quantificador universal: o veterinário deve ter atendido em cada uma das cidades cadastradas. Essa distinção é fundamental em SQL e é exatamente o que a banca explora.
Vamos decompor a consulta do enunciado:
SELECT nome
FROM VETERINARIO v
WHERE id_vet IN (
SELECT id_vet
FROM ATENDIMENTO a
INNER JOIN CLINICA c ON a.id_clinica = c.id_clinica
);A subconsulta faz um INNER JOIN entre ATENDIMENTO e CLINICA, retornando os id_vet que possuem ao menos um atendimento em qualquer clínica (e, portanto, em qualquer cidade). O IN no WHERE externo simplesmente filtra os veterinários cujo id_vet aparece nessa lista. Ou seja, o resultado são todos os veterinários que já realizaram pelo menos um atendimento, independentemente de quantas cidades diferentes foram atendidas.
Para ilustrar, imagine que existam três cidades cadastradas: Goiânia, Anápolis e Aparecida de Goiânia. Um veterinário que atendeu apenas em Goiânia seria incluído no resultado, mesmo não tendo atendido em Anápolis nem em Aparecida. Isso contraria diretamente a exigência de "todas as cidades".
A solução correta exigiria uma abordagem diferente. Uma forma clássica é contar quantas cidades distintas o veterinário atendeu e comparar com o total de cidades cadastradas:
SELECT v.nome
FROM VETERINARIO v
INNER JOIN ATENDIMENTO a ON v.id_vet = a.id_vet
INNER JOIN CLINICA c ON a.id_clinica = c.id_clinica
GROUP BY v.id_vet, v.nome
HAVING COUNT(DISTINCT c.cidade) = (SELECT COUNT(*) FROM CLINICA);Nessa versão, agrupamos por veterinário, contamos as cidades distintas em que ele atendeu e comparamos com o total de cidades. Somente os veterinários cuja contagem for igual ao total serão retornados. Alternativamente, poder-se-ia usar uma dupla negação com NOT EXISTS, mas a abordagem com GROUP BY e HAVING é a mais direta e didática.
A pegadinha da banca é justamente a inversão do quantificador: o candidato que lê rapidamente pode achar que a consulta está correta, pois ela usa IN e um JOIN, mas não percebe que falta a condição de "todos". A banca explora a confusão entre "existe pelo menos um" e "todos".
A banca troca o quantificador universal ("todas as cidades") pelo existencial ("pelo menos uma cidade"). O comando com IN e JOIN parece plausível, mas não faz nenhuma comparação com o total de cidades. Para resolver, lembre-se: "todos" em SQL quase sempre exige GROUP BY + HAVING com COUNT(DISTINCT ...) comparado ao total, ou uma dupla negação com NOT EXISTS.
A alternativa afirma que o comando apresenta corretamente os veterinários que realizaram atendimentos em todas as cidades. Isso é falso, pois a consulta retorna veterinários que realizaram pelo menos um atendimento em qualquer cidade, sem verificar se atenderam em todas. O erro está na ausência de uma condição que compare o número de cidades distintas atendidas com o total de cidades cadastradas.
A alternativa está correta ao afirmar que o comando está errado. A justificativa é exatamente a explicada: a subconsulta com IN e INNER JOIN implementa o quantificador existencial, não o universal. Para atender ao requisito "todas as cidades", seria necessário usar GROUP BY com HAVING COUNT(DISTINCT c.cidade) = (SELECT COUNT(*) FROM CLINICA) ou uma abordagem equivalente com NOT EXISTS.
Gabarito: letra E
Link permanente: /questoes/qg599041