Solution en deux phases :
CREATE VIEW CRUSIG AS
SELECT P.NUM, P.NOM, P.PRENOM, V.CRU
FROM PRODUCTEURS P, RECOLTES R, VINS V
WHERE P.NUM=R.NPROD AND V.NUM=R.NVIN
GROUP BY P.NUM, P.NOM, P.PRENOM, V.CRU
HAVING SUM(R.QUANTITE) > 200
SELECT NOM, PRENOM, COUNT(*)
FROM CRUSIG
GROUP BY NUM, NOM, PRENOM
Solution en une requête :
Select P.NOM, P.PRENOM, Count (Distinct V.CRU)From PRODUCTEURS P, RECOLTES R, VINS V
Where P.NUM = R.NPROD and
R.NVIN = V.NUM and
V.CRU in ( Select V1.CRU
From VINS V1, RECOLTES R1
Where R1.NPROD = P.NUM and
R1.NVIN = V1.NUM
Group By V1.CRU
Having Sum (R1.QUANTITE) > 200 )
Group By P.NUM, P.NOM, P.PRENOM
Nombre de tuples : 50 (>200) ou 52 (>=200)
Erreurs classiques
a) Oubli de la clause Distinct dans le Count => on compte aussi les doubles
b) On groupe par nom, prénom alors que la clé de PRODUCTEURS est num