Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie schreibe ich eine einfache Auswahlabfrage, anstatt Ansichten zu verwenden?

Was Sie brauchen, ist ein HAVING -Klausel, um COUNT(*) = 2 zu finden nach Gruppierung nach Datum und Fachgebiet. Tatsächlich sollte nicht einmal eine Verschachtelung notwendig sein. (Ich habe auch Ihren impliziten Join durch kommagetrenntes FROM ersetzt -Klausel mit einem expliziten JOIN , was die bevorzugtere moderne Syntax ist).

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 */

Die SELECT hier auflisten und GROUP BY sollte die Patienten-ID, das Fachgebiet, das Datum und die Anzahl der Besuche für die aggregierte Kombination dieser 3 Spalten ergeben. Das HAVING Klausel beschränkt sie dann auf diejenigen mit 2 Besuchen für die Gruppe.

nur ziehen die Patienten daraus, packen Sie es in eine Unterabfrage:

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