[Access SQL] Avec ou sans sous-requêtes ?

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,

SELECT DISTINCT equipe.idequipe,  
                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,

SELECT equipe.idequipe,  
       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 ?

4 réflexions au sujet de « [Access SQL] Avec ou sans sous-requêtes ? »

  1. Avatar de f-lebf-leb Auteur de l’article

    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.

  2. Avatar de f-lebf-leb Auteur de l’article

    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,

    ...SUM( CASE WHEN scoreequipedomicile &gt; scoreequipeext THEN 1 ELSE 0 END )

    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

Laisser un commentaire