Ce dont vous avez besoin, c'est d'un HAVING
clause pour trouver COUNT(*) = 2
après regroupement par date et spécialité. En fait, aucune imbrication ne devrait même être nécessaire. (J'ai également remplacé votre jointure implicite par des virgules séparées FROM
clause avec un JOIN
explicite , qui est la syntaxe moderne préférée).
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 */
Le SELECT
list ici et GROUP BY
doit produire l'identifiant du patient, la spécialité, la date et le nombre de visites pour la combinaison agrégée de ces 3 colonnes. Le HAVING
clause le limite alors uniquement à ceux ayant 2 visites pour le groupe.
Pour tirer uniquement les patients de ceci, enveloppez-le dans une sous-requête :
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