Questão de Banco de Dados — Consultas e Comandos em SQL — Quadrix 2025
- Código
- qa698956
- Banca
- Quadrix
- Órgão
- CRM MS
- Ano
- 2025
- Cargo
- Ana ( )
- CCerto
- EErrado
GabaritoC — Certo
Gabarito: CERTO (letra C). A consulta está correta: ela seleciona os médicos que têm participação em congresso cuja data_inicio é de 2023 e que não possuem participação em congresso de 2024, usando a subconsulta com NOT IN para excluir exatamente esses. A lógica de conjuntos (participou em 2023 menos participou em 2024) está bem implementada.
Vamos entender o que a consulta faz passo a passo. O objetivo é encontrar médicos que participaram de congressos em 2023, mas não participaram de nenhum congresso em 2024. Isso é uma operação de diferença de conjuntos: queremos o conjunto A (médicos de 2023) menos o conjunto B (médicos de 2024).
A consulta principal faz o seguinte:
SELECT DISTINCT M.nome: seleciona o nome de cada médico, sem repetições (um médico pode ter participado de vários congressos em 2023).
FROM Medicos M JOIN Participacoes P ON M.id_medico = P.id_medico: junta a tabela de médicos com a de participações, para saber quais médicos participaram de algum congresso.
JOIN Congressos C ON P.id_congresso = C.id_congresso: junta com a tabela de congressos, para acessar as datas.
WHERE EXTRACT(YEAR FROM C.data_inicio) = 2023: filtra apenas as participações em congressos que começaram em 2023.
AND M.id_medico NOT IN (SELECT P2.id_medico FROM Participacoes P2 JOIN Congressos C2 ON P2.id_congresso = C2.id_congresso WHERE EXTRACT(YEAR FROM C2.data_inicio) = 2024): a subconsulta retorna todos os médicos que participaram de congressos que começaram em 2024. O NOT IN exclui esses médicos do resultado final.
O resultado: médicos que estão no conjunto de 2023, mas não estão no conjunto de 2024. Exatamente o que o enunciado pede.
Um ponto importante: a consulta usa EXTRACT(YEAR FROM C.data_inicio), ou seja, considera o ano de início do congresso. Se um congresso começou em 2023 e terminou em 2024, ele conta como 2023. Isso é uma escolha de design, mas é consistente com o que o enunciado pede ("participaram de congressos em 2023"). A consulta está correta dentro dessa lógica.
Outro detalhe: o NOT IN com subconsulta é uma forma válida de fazer diferença de conjuntos. Uma alternativa seria usar NOT EXISTS, que às vezes é mais eficiente, mas ambas estão corretas. O NOT IN tem uma pegadinha clássica com valores NULL, mas aqui a coluna id_medico é chave primária e nunca é nula, então não há problema.
Agora, vamos verificar se há alguma pegadinha na consulta que a tornaria incorreta. O DISTINCT é necessário porque um médico pode ter participado de vários congressos em 2023, e sem ele o nome apareceria repetido. O JOIN com Participacoes e Congressos está correto, usando as chaves estrangeiras. A condição EXTRACT(YEAR FROM C.data_inicio) = 2023 filtra corretamente. A subconsulta com NOT IN exclui corretamente os médicos de 2024. Não há erro de sintaxe nem de lógica.
A banca poderia tentar confundir o candidato com o uso de NOT IN e valores NULL. Se id_medico pudesse ser NULL na subconsulta, o NOT IN retornaria vazio (porque NULL não é comparável). Mas aqui id_medico é chave primária e nunca é nulo, então a consulta funciona. Outra pegadinha seria inverter os anos (2024 e 2023), mas a consulta está correta.
A consulta está correta. Ela implementa a diferença de conjuntos: médicos que participaram em 2023 e não em 2024. A lógica está bem construída:
A consulta principal seleciona médicos com participação em congressos de 2023.
A subconsulta identifica médicos com participação em congressos de 2024.
O NOT IN exclui os médicos de 2024 do resultado.
Não há erro de sintaxe, de lógica ou de interpretação. O DISTINCT evita duplicatas, os JOINs estão corretos, e o EXTRACT filtra pelo ano de início do congresso. A consulta atende exatamente ao que o enunciado pede.
Gabarito: letra C (CERTO).
Link permanente: /questoes/qa698956