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

¿Cómo escribo una consulta de selección simple en lugar de usar vistas?

Lo que necesitas es un HAVING cláusula para encontrar COUNT(*) = 2 después de agrupar por fecha y especialidad. De hecho, ni siquiera debería ser necesario anidar. (También he reemplazado su unión implícita por FROM separados por comas cláusula con un JOIN explícito , que es la sintaxis moderna preferida).

SELECT 
  v.pid,
  d.speciality,
  v.date,
  COUNT(COUNT DISTINCT d.did) AS numvisits
FROM 
  visits v
  JOIN Doctors d ON v.did = d.did
GROUP BY v.pid, d.speciality, v.date
HAVING COUNT(COUNT DISTINCT d.did) = 2
/* Note - depending on your RDBMS, you may
   be able to use the count alias as
HAVING numvisits = 2 
   MySQL allows this, for ex, but MS SQL Server doesn't and I think Oracle doesn't */

El SELECT liste aquí y GROUP BY debe producir la identificación del paciente, la especialidad, la fecha y el número de visitas para la combinación agregada de esas 3 columnas. El HAVING la cláusula luego lo limita solo a aquellos con 2 visitas para el grupo.

Para tirar solo los pacientes de esto, envuélvalo en una subconsulta:

SELECT Patients.* 
FROM Patients JOIN (
  SELECT 
    v.pid,
    d.speciality,
    v.date,
    COUNT(COUNT DISTINCT d.did) AS numvisits
  FROM 
    visits v
    JOIN Doctors d ON v.did = d.did
  GROUP BY v.pid, d.speciality, v.date
  HAVING COUNT(COUNT DISTINCT d.did) = 2
) subq ON Patients.pid = subq.pid