Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como posso melhorar essa consulta para evitar o uso de visualizações aninhadas?

Familiarize-se com os dados que você tem:


A primeira coisa importante é entender quais dados você tem. Aqui neste caso, você tem quatro tabelas
  • Companhias de Seguros
  • Paciente
  • Médicos
  • Visitas

Sua meta:


Encontre a lista de todos os pacientes que visitaram todos os ortopedistas (especialidade) associados às suas Seguradoras.

Vamos dar um passo atrás e analisá-lo em partes menores:


Geralmente, os requisitos podem ser um pouco esmagadores quando você os analisa como um todo. Vamos dividir os requisitos em componentes menores para entender o que você precisa fazer.
  1. Parte a: Você precisa encontrar a lista de médicos, cuja especialidade é 'Ortopedista'
  2. Parte b: Encontre a lista de pacientes que visitaram os médicos identificados no número 1.
  3. Parte c: Filtre o resultado nº 2 para encontrar a lista de pacientes e médicos que compartilham a mesma seguradora.
  4. Parte d: Saiba que os pacientes que visitaram cada um desses Ortopedistas que pertencem à mesma companhia de seguros que o paciente.

Como abordar:


  1. Você precisa identificar seu objetivo principal, aqui neste caso para identificar a lista de pacientes. Portanto, consulte primeiro a tabela Paciente.

  2. Você tem os pacientes, na verdade todos eles, mas precisamos descobrir quais desses pacientes visitaram os médicos. Não vamos nos preocupar se o médico é ortopedista ou não. Só precisamos da lista de pacientes e dos médicos que eles visitaram. Não há mapeamento entre a tabela Paciente e Médico. Para saber essas informações,

    Junte-se à tabela Pacientes com a tabela Visitas no campo-chave correto.

    Em seguida, junte a saída com a tabela Doctors no campo-chave correto.

  3. Se você fez a junção corretamente, agora você deve ter a lista de todos os pacientes e os médicos que eles visitaram. Se você usou LEFT OUTER JOIN , você encontrará até mesmo os pacientes que nunca visitaram um médico. Se você usou RIGHT OUTER JOIN , você encontrará apenas os pacientes que visitaram um médico.

  4. Agora, você tem todos os pacientes e os médicos que eles visitaram. No entanto, o requisito é encontrar apenas os médicos que são Ortopedistas . Portanto, aplique a condição para filtrar o resultado para fornecer apenas o resultado desejado.

  5. Agora você atingiu os requisitos divididos em componentes menores na parte a e parte b . Você ainda precisa filtrá-lo pelas companhias de seguros. Aqui está a parte complicada, o requisito não diz que você precisa exibir a seguradora, então não precisamos usar a tabela InsuranceCompanies. Sua próxima pergunta será 'How am I going to filter the results?' . Ponto válido. Descubra se alguma das três tabelas Patient , Doctor e Visits conter as informações da seguradora. Patient e Doctors têm um campo comum. Junte-se a esse campo comum para filtrar o resultado.

  6. Encontre a contagem de Ortopedistas únicos que cada paciente visitou.

  7. Aqui está a parte que pode ser feita de várias maneiras, uma das maneiras de fazer isso seria adicionar uma subconsulta que seria sua quarta coluna na saída. Esta subconsulta consultaria a tabela Médicos e filtraria por especialidade ='Ortopedista'. Além desse filtro, você também precisa filtrar combinando a seguradora na tabela interna com o ID da seguradora na tabela Pacientes que está na consulta principal. Esta subconsulta retornará a contagem de todos os Ortopedistas para o ID da seguradora que corresponda aos dados do paciente.

  8. Agora você deve ter os campos patient id , patient name , patients visits count e o total number of Orthopedists in same insurance company da subconsulta. Você pode então adicionar uma junção externa que filtrará os resultados desta tabela derivada nos campos onde patients visits count corresponde ao total number of Orthopedists in same insurance company . Não estou dizendo que esta é a melhor abordagem. Esta é uma abordagem que eu posso pensar.

  9. Se você seguir a lógica acima, você deve ter isso.

Lista de pacientes que visitaram todos os médicos

Filtrado apenas por médicos, que são ortopedistas

Filtrado por pacientes e médicos que compartilham as mesmas informações da seguradora.

Novamente, toda a saída é filtrada pelos dois campos de contagem encontrados na saída da tabela derivada.

A bola está do seu lado:

  • Tente passo a passo e quando encontrar a resposta. Poste aqui como uma resposta separada. Vou votar para compensar todos os votos negativos que você recebeu nesta pergunta.

Estou confiante de que você pode fazer isso facilmente.

Se você tropeçar...


Não hesite em postar suas perguntas como comments to this answer , Outros e eu teremos prazer em ajudá-lo.

Isenção de responsabilidade


Eu forneci uma das muitas maneiras de como essa lógica pode ser implementada. Estou certo de que existem muitas maneiras de implementar isso de uma maneira muito melhor.

Resultado:


Consulte a resposta de @Ofek Ron para a consulta correta que produz a saída desejada. Eu não escrevi nenhuma parte da consulta. Foi todo o esforço do OP.