Requête pas si "simple" en fait.
Etant donné qu'il faut répondre à la fois à plusieurs conditions portants sur plusieurs lignes d'une même table, il faut utiliser autant d'aliases de la table que conditions. Ca rends la généricité du code bien plus complexe.
Je te donne une autre solution qui est un peu plus bidouille, et dont le fonctionnement reste à confirmer (ça m'est venu comme ça dans un éclair de folie
). Si elle marche, elle est bien mieu dans la mesure ou tu n'as pas besoin de réécrire la requête si tu change le nombre de marques à tester, ou faire des tests style "Personne ayant au moins des voitures de X marques différentes parmis les Y marques"
La procédure "classique" :
SELECT DISTINCT U.NOM
FROM POSSEDEVOITURE P3, POSSEDEVOITURE P2, POSSEDEVOITURE P1, UTILISATEUR U
WHERE P1.ID_UTILISATEUR = U.ID AND P1.MARQUE_VOITURE = 'RENAULT'
AND P2.ID_UTILISATEUR = U.ID AND P2.MARQUE_VOITURE = 'PEUGEOT'
AND P3.ID_UTILISATEUR = U.ID AND P3.MARQUE_VOITURE = 'CITROEN'
=> La, ça va te retourner la liste des utilisateurs qui ont au moins un modèle de chacune des trois marques.
Maintenant, il y a une autre solution, qui devrait marcher (à confirmer) qui est moins scolaire.
SELECT U.NOM, COUNT(DISTINCT P.MARQUE_VOITURE)
FROM POSSEDEVOITURE P, UTILISATEUR U
WHERE P.UTILISATEUR_ID = U.ID AND P.MARQUE_VOITURE IN ('RENAULT', 'PEUGEOT', 'CITROEN')
GROUP BY U.NOM
HAVING COUNT(DISTINCT P.MARQUE_VOITURE) >= 3
=> Ca devrait faire pareil
Message édité par Arjuna le 24-08-2004 à 16:34:47