Retour au sommaire du Travail Pratique Access

6.3    Requête sur 2 versions d'une même table ReqMêmeOrdrePassage


On va se poser maintenant la question suivante  y-aurait-il des séries dans lesquelles deux concurrents ont le même ordre de passage ? Si tel était le cas, il s'agirait d'une incohérence qu'il convient de supprimer.
Pour s'en rendre compte, il faudrait regarder la table Regrouper, et pour chaque Dossard, vérifier s'il n'y a pas, dans le reste de la table, un autre Dossard pour lequel Ordre_Pass est le même. Or que fait une requête SQL entre deux tables ? Elle effectue un parcours de chaque ligne d'une table, avec pour chaque ligne de cette table une recherche de correspondance avec toutes les lignes successives de l'autre table. Pour notre problème, cela veut dire qu'il nous faut une version de la table Regrouper, dans laquelle on inspecte une à une chaque ligne, et pour un Dossard donné, on doit rechercher dans une deuxième version de cette table un autre Dossard qui, pour la même série aurait le même ordre de passage.
Nous avons donc besoin de deux versions de la table Regrouper. Créons donc cette nouvelle requête par le bouton "Nouveau", en mode Création, ajoutons deux fois la requête Regrouper. Ces tables portent le nom Regrouper et Regrouper_1. On va les rebaptiser respectivement R1 et R2, comme dans la figure qui suit :
 


Pour ce faire, on se met en Mode SQL et on édite la table de la façon suivante :

SELECT    *
FROM    Regrouper AS R1, Regrouper AS R2;
En se mettant ensuite en Mode Création, on obtient le résultat escompté. Il nous faut maintenant exprimer les termes de la recherche entre les deux tables : on veut la même série et le même ordre de passage. Il suffit pour cela de "tirer" à la souris le lien entre les champs Num_Série et Ordre_Pass comme le montre la figure suivante :
 


Ensuite on indique les champs souhaités (Num-Série, Dossard et Ordre_Pass pris dans R1), en terminant par le Critère sur Dossard <>R2.Dossard exprimant le fait que l'on cherche 2 Dossards différents dans la même série avec le même ordre de passage. On devrait obtenir un résultat de la forme (attention, rééditer la version SQL pour enlever le "*" derrière SELECT que l'on avait ajouté) :
 


On pourra regarder la requête SQL qui en découle :

SELECT    R1.Num_Série, R1.Dossard, R1.Ordre_Pass
FROM    Regrouper AS R1 INNER JOIN Regrouper AS R2 ON (R1.Num_Série = R2.Num_Série) AND (R1.Ordre_Pass = R2.Ordre_Pass)
WHERE    (((R1.Dossard)<>[R2].[Dossard]))
ORDER BY R1.Num_Série, R1.Dossard;



Exercice facultatif :


ReqDans2SériesDeLaMêmeEpreuve

On pourra s'entraîner sur un problème similaire, un peu plus complexe. Il s'agit de déterminer les concurrents qui seraient regroupés dans deux séries correspondant à la même épreuve. Encore une contrainte d'intégrité violée si une telle incohérence existe dans notre base de données… Ce qui est d'ailleurs le cas si l'on se réfère au résultat que l'on obtient :

 

Suite

Retour au sommaire du Travail Pratique Access