sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo puedo mejorar esta consulta para evitar el uso de vistas anidadas?

Familiarícese con los datos que tiene:

La primera clave es entender qué datos tienes. Aquí en este caso, tienes cuatro mesas

  • Compañías de Seguros
  • Paciente
  • Doctores
  • Visitas

Tu objetivo:

Encuentre la lista de todos los pacientes que visitaron a todos los ortopedistas (especialidad) asociados a sus Compañías de Seguros.

Demos un paso atrás y analicémoslo en partes más pequeñas:

En general, los requisitos pueden ser un poco abrumadores cuando los miras en su conjunto. Dividamos los requisitos en componentes más pequeños para comprender lo que debe hacer.

  1. Parte a: Necesita encontrar la lista de médicos, cuya especialidad es 'Ortopedista'
  2. Parte b: Encuentre la lista de pacientes que visitaron a los médicos identificados en el n.° 1.
  3. Parte c: Filtre el resultado #2 para encontrar la lista de pacientes y médicos que comparten la misma compañía de seguros.
  4. Parte d: Averigüe que los pacientes que visitaron a cada uno de esos ortopedistas que pertenecen a la misma compañía de seguros que el paciente.

Cómo abordar:

  1. Debe identificar su objetivo principal, aquí en este caso para identificar la lista de pacientes. Por lo tanto, primero consulte la tabla Paciente.

  2. Tienes a los pacientes, en realidad a todos, pero necesitamos encontrar cuál de estos pacientes visitó a los médicos. No nos preocupemos de si el médico es ortopedista o no. Solo necesitamos la lista de pacientes y los médicos que han visitado. No hay mapeo entre la tabla Paciente y Doctores. Para conocer esta información,

    Únase a la tabla Paciente con la tabla Visitas en el campo clave correcto.

    Luego, una la salida con la tabla Doctores en el campo clave correcto.

  3. Si ha realizado la unión correctamente, ahora debería tener la lista de todos los pacientes y los médicos que han visitado. Si usó LEFT OUTER JOIN , encontrará incluso a los pacientes que nunca habían visitado a un médico. Si usó RIGHT OUTER JOIN , encontrará solo los pacientes que visitaron a un médico.

  4. Ahora, tienes todos los pacientes y los médicos a los que han visitado. Sin embargo, el requisito es encontrar solo a los médicos que son Ortopedistas . Entonces, aplique la condición para filtrar el resultado para dar solo el resultado deseado.

  5. Ahora ha cumplido los requisitos divididos en componentes más pequeños en parte a y parte b . Todavía necesita filtrarlo por las compañías de seguros. Aquí está la parte difícil, el requisito no dice que debe mostrar la compañía de seguros, por lo que no tenemos que usar la tabla InsuranceCompanies. Su próxima pregunta será 'How am I going to filter the results?' . Punto valido. Averigüe si alguna de las tres tablas Patient , Doctor y Visits contener la información de la compañía de seguros. Patient y Doctors tener un campo común. Únete a ese campo común para filtrar el resultado.

  6. Encuentre el recuento de ortopedistas únicos que cada paciente ha visitado.

  7. Aquí está la parte que se puede hacer de muchas maneras, una de las formas de hacerlo sería agregar una subconsulta que sería su cuarta columna en la salida. Esta consulta secundaria consultaría la tabla Doctores y filtraría por especialidad ='Ortopedista'. Además de ese filtro, también debe filtrar haciendo coincidir la compañía de seguros en la tabla interna con la identificación de la compañía de seguros en la tabla Pacientes que se encuentra en la consulta principal. Esta subconsulta devolverá el recuento de todos los ortopedistas para la identificación de la compañía de seguros que coincida con los datos del paciente.

  8. Ahora debería tener los campos patient id , patient name , patients visits count y el total number of Orthopedists in same insurance company de la consulta secundaria. Luego puede agregar una combinación externa que filtrará los resultados de esta tabla derivada en los campos donde patients visits count coincide con total number of Orthopedists in same insurance company . No estoy diciendo que este sea el mejor enfoque. Este es un enfoque que se me ocurre.

  9. Si sigue la lógica anterior, debería tener esto.

Lista de pacientes que han visitado a todos los médicos

Filtrado solo por médicos, cuyos son Ortopedistas

Filtrado por pacientes y médicos que comparten la misma información de la compañía de seguros.

Una vez más, toda la salida se filtra por los dos campos de recuento que se encuentran dentro de la salida de la tabla derivada.

La pelota está en tu campo:

  • Pruébalo paso a paso y una vez que encuentres la respuesta. Publíquelo aquí como una respuesta separada. Lo votaré a favor para compensar todos los votos negativos que recibió en esta pregunta.

Estoy seguro de que puede hacerlo fácilmente.

Si tropiezas...

No dude en publicar sus preguntas como comments to this answer , Otros y yo estaremos encantados de ayudarle.

Descargo de responsabilidad

He proporcionado una de las muchas formas en que se puede implementar esta lógica. Estoy seguro de que hay muchas maneras de implementar esto de una manera mucho mejor.

Resultado:

Consulte la respuesta de @Ofek Ron para conocer la consulta correcta que produce el resultado deseado. No escribí ninguna parte de la consulta. Todo fue esfuerzo de OP.