Questão nº 56
Questão de Tecnologia da Informação · FCC DPE-AM 2017 (nº 56)
Sejam as seguintes tabelas de um banco de dados relacional:
Médico (CRM, Nome-Médico, Especialidade)
Atende (ID, CRM)
Paciente (ID, Nome-Paciente, Data-Nascimento)
O comando T-SQL para obter o nome dos pacientes, o nome e especialidade de seus médicos é:
- ASELECT Nome-Paciente, Nome-Médico, Especialidade
FROM Médico, Atende, Paciente - BSELECT Nome-Paciente, Nome-Médico, Especialidade
FROM Médico, Atende, Paciente
WHERE CRM = CRM AND ID = ID - CSELECT Nome-Paciente, Nome-Médico, Especialidade
FROM Médico, Paciente
WHERE Médico.CRM = Atende.CRM AND Atende.ID = Paciente.ID - DSELECT Nome-Paciente, Nome-Médico, Especialidade
FROM Médico, Paciente - ESELECT Nome-Paciente, Nome-Médico, Especialidade
FROM Médico, Atende, Paciente
WHERE Médico.CRM = Atende.CRM AND Atende.ID = Paciente.ID (alternativa correta)
Resposta comentada
Gabarito Alternativa E
Para obter dados de várias tabelas que se relacionam, usamos o comando SELECT junto com a cláusula FROM para listar as tabelas e a cláusula WHERE para especificar as condições de junção (como as tabelas se conectam). Sem as condições de junção corretas, o banco de dados fará um produto cartesiano, combinando cada linha de uma tabela com cada linha das outras, o que raramente é o desejado.
- (A) Incorreta: Esta consulta lista todas as tabelas no
FROMmas não especifica nenhuma condição de junção noWHERE. Isso resultaria em um produto cartesiano, onde cada médico seria combinado com cada registro de atendimento e cada paciente, gerando um resultado gigante e sem sentido. - (B) Incorreta: Esta é a armadilha da banca. Embora liste todas as tabelas e inclua uma cláusula
WHERE, as condiçõesCRM = CRMeID = IDsão sempre verdadeiras e não estabelecem as ligações entre as tabelas.CRMexiste emMédicoeAtende, eIDemAtendeePaciente. Sem especificarMédico.CRM = Atende.CRMeAtende.ID = Paciente.ID, o banco de dados não sabe como juntá-las, resultando, na prática, em um produto cartesiano, assim como na alternativa A. - (C) Incorreta: A cláusula
FROMlista apenasMédicoePaciente. No entanto, a cláusulaWHEREtenta referenciar a tabelaAtende(Atende.CRMeAtende.ID), que não foi incluída noFROM. Isso geraria um erro de sintaxe, pois não se pode referenciar uma tabela que não está na lista de origem. - (D) Incorreta: Esta alternativa lista apenas
MédicoePacientenoFROMe não inclui a tabelaAtende. A tabelaAtendeé essencial para ligar os médicos aos pacientes. Sem ela, não é possível saber qual médico atende qual paciente, e a consulta não conseguiria o resultado desejado. - (E) Correta: Esta é a resposta correta. A cláusula
FROM Médico, Atende, Pacientelista todas as tabelas necessárias. A cláusulaWHERE Médico.CRM = Atende.CRM AND Atende.ID = Paciente.IDestabelece corretamente as condições de junção:Médico.CRM = Atende.CRMconecta a tabelaMédicocom a tabelaAtende, eAtende.ID = Paciente.IDconecta a tabelaAtendecom a tabelaPaciente. Isso garante que apenas as linhas relacionadas entre as três tabelas sejam combinadas, fornecendo o nome do paciente, o nome do médico e sua especialidade.
Fonte: FCC DPE-AM 2017 Analista em Gestão Especializado em Tecnologia da Informação de Defensoria - Analista de Banco de Dados (Caderno Tipo 001). Reproduzida para fins de estudo.