FC ConcursosFC Concursos

Questão FC369470

William está trabalhando com a base de dados de uma clínica, onde estão presentes as entidades descritas a seguir. Paciente (Id: Integer PK, Nome: Varchar(50)) Medico (Id: Integer

Linguagem SQL

FGV · 2024

William está trabalhando com a base de dados de uma clínica, onde estão presentes as entidades descritas a seguir.


Paciente (Id: Integer PK,
   Nome: Varchar(50))
Medico (Id: Integer PK, Nome: Varchar(50))
Atendimento (Id: Integer PK,
   IdPaciente: Integer FK(Paciente),
   IdMedico: Integer FK(Medico),
   Data: Date)

 

Para que William obtenha os nomes dos pacientes que foram tratados por todos os médicos, a instrução SQL a ser utilizada é:

  1. select p.nome from paciente p, atendimento a where a.idpaciente = p.id and a.idmedico = all (select id from medico);
  2. select p.nome from paciente p where not exists ( select id from medico m where id not in ( select idmedico from atendimento where idpaciente = p.id));
  3. select p.nome from paciente p where exists ( select idmedico from atendimento where idpaciente = p.id);
  4. select p.nome from paciente p, atendimento a where a.idpaciente=p.id group by p.nome having count(*) = (select count(*) from medico);
  5. select p.nome from paciente p, atendimento a where a.idpaciente = p.id and a.idmedico = any (select id from medico);
Mostrar resposta e comentário

Gabarito

B

Comentário do professor

A consulta seleciona os nomes de cada paciente que foi atendido por todos os médicos. O mecanismo é a negação da existência: NOT EXISTS garante que não exista nenhum médico que não tenha atendido o paciente.

Para cada linha de paciente p, a subconsulta correlacionada (correlated subquery) usa p.id em where idpaciente = p.id para obter os médicos que o paciente efetivamente teve. Em seguida, o predicado NOT IN verifica se há algum medico m cujo id NÃO está nessa lista. Se tal médico não existir, significa que o paciente foi atendido por todos os médicos, então o nome é incluído.

Observação: se houver NULL em idmedico, NOT IN pode produzir resultados inesperados; nesse caso, preferir a lógica com NOT EXISTS aninhado evita esse problema.

Conteúdo do catálogo FC Concursos · Atualizado em

Continue aprendendo