On s’intéresse aux résultats de la Ligue 1
En fonction des scores des rencontres, on souhaite une requête qui renverrait pour chaque équipe les nombres de victoires, nuls et défaites à domicile.
1ère solution: avec des sous-requêtes corrélées,
equipe.nomequipe,
(SELECT COUNT(*)
FROM [Match] m1
WHERE m1.idequipedomicile = equipe.idequipe
AND m1.scoreequipedomicile > m1.scoreequipeext) AS gagne
,
(SELECT COUNT(*)
FROM [Match] m1
WHERE m1.idequipedomicile = equipe.idequipe
AND m1.scoreequipedomicile = m1.scoreequipeext) AS nul,
(SELECT COUNT(*)
FROM [Match] m1
WHERE m1.idequipedomicile = equipe.idequipe
AND m1.scoreequipedomicile < m1.scoreequipeext) AS perdu
FROM equipe
LEFT JOIN [Match]
ON equipe.idequipe = match.idequipedomicile;
2ème solution: sans sous-requêtes, dans une requête qui regroupe les rencontres à domicile de chaque équipe,
equipe.nomequipe,
SUM(Iif(scoreequipedomicile > scoreequipeext, 1, 0)) AS gagne,
SUM(Iif(scoreequipedomicile = scoreequipeext, 1, 0)) AS nul,
SUM(Iif(scoreequipedomicile < scoreequipeext, 1, 0)) AS perdu
FROM equipe
LEFT JOIN [Match]
ON equipe.idequipe = match.idequipedomicile
GROUP BY equipe.idequipe,
equipe.nomequipe;
…SUM(Iif(scoreequipedomicile > scoreequipeext, 1, 0)) AS gagne, …
En cas de victoire à domicile, l’expression Iif retourne 1 et 0 sinon. Puis on somme les victoires.
Même principe pour les nuls et défaites.
Et vous, quelle solution vous préférez, 1 ou 2 ?
Re
Merci pour ce retour des plus intéressant.
Après avoir remplie la table avec près de 40 000 rencontres pour avoir des temps significatifs, le verdict est tombé et il n’y a pas photo…
Lorsque la 1ère version avec des sous-requêtes corrélées fait fumer l’ordi pendant près de deux minutes, la 2ème version sans sous-requête mais avec Iif me crache le résultat dans la seconde.
Et comme la 2ème version est davantage sympathique dans l’écriture, c’est 2-0 pour cette version.
Salut Philippe,
Je ne suis pas allé jusqu’au bout (pas assez de matchs de foot dans ma table ) et donc je n’ai pas testé les performances.
Si le SQL d’Access disposait des instructions normalisées de branchements optimisées CASE…WHEN,
je pense que la 2ème serait plus efficace.
Maintenant avec le « Iif » du VBA d’Access, c’est moins évident…
Quand j’aurais un peu de temps, je ferais des essais.
Merci de ton retour
Fabien
Salut
J’aime bien la deuxième, plus digeste à lire
As-tu une idée de la différence de rapidité d’exécution ?
Philippe