Retour au sommaire du Travail Pratique Access

6.4    Requêtes imbriquées : ReqDansSérieSansInscriptionEpreuve


La question que l'on va se poser maintenant est la suivante  y-aurait'il un concurrent qui serait dans une série d'une épreuve à laquelle il ne s'est pas inscrit ? Autre incohérence potentielle, une de plus...
On sait comment trouver les Num_Epreuve pour les séries où est regroupé chaque candidat : on trouve l'information au sein des tables Série et Regrouper. De la même façon, entre les tables Inscrire et Regrouper on a les Num_Epreuve auxquelles sont inscrits les candidats. Tout le problème est de trouver, pour chaque Dossard si un Num_Epreuve dans la première liste est absent de la seconde liste pour le même candidat. Nous allons voir que ce problème pourra se résoudre grâce à une requête imbriquée.
Commençons par créer la liste pour chaque concurrent des Num_Epreuve correspondants aux séries dans lesquelles il est regroupé. La figure suivante montre cette requête, où R et S sont les noms que l'on a donnés aux tables Regrouper et Série :
 


En Mode Feuille de données, on aurait le résultat suivant (ajouter DISTINCT ROW après SELECT si l'on a des lignes identiques) :
 


Cette dernière requête sera baptisée ReqDossardEpreuveViaSérie, par opposition à la requête qui suit qui s'appellera ReqDossardEpreuveViaInscription.
Cette deuxième requête est présentée ci-dessous ; les tables Regrouper et Inscrire ont été baptisées R2 (on verra plus loin pourquoi) et I.
 


Le résultat de cette requête est montré dans la figure qui suit dans laquelle on a mis en évidence le concurrent 71. En comparant les deux tables, on voit bien qu'il y a un problème pour ce concurrent.
 


On voit maintenant ce qu'il nous reste à faire : chercher dans la première liste, pour chaque Dossard, un Num_Epreuve qui n'apparaîtrait pas dans les Num_Epreuve de la deuxième liste pour ce même Dossard. Ceci suggère le recours, dans la première requête, à la clause NOT IN (liste de valeurs), où cette liste est donnée par la deuxième requête. D'où la notion de requête imbriquée : Req…ViaInscription sera imbriquée dans Req… ViaSérie.
Pour ce faire, nous allons faire une copie de la requête …ViaSérie ( puis ) rebaptisée ReqDansSérieSansInscriptionEpreuve.
Puis nous prendrons la formulation SQL de la requête …ViaInscription que l'on copiera dans la formulation SQL de la requête finale de la façon suivante :

SELECT    R.Dossard, S.Num_Epreuve
FROM    Série AS S INNER JOIN Regrouper AS R ON S.Num_Série = R.Num_Série
WHERE    S.Num_Epreuve NOT IN (
SELECT I.Num_Epreuve
FROM Regrouper AS R2 INNER
JOIN Inscrire AS I ON
R2.Dossard = I.Dossard
WHERE I.Dossard=R.Dossard
)

ORDER BY R.Dossard, S.Num_Epreuve;

On comprend le recours à R2 dans la requête imbriquée pour éviter la confusion avec R du SELECT initial. En Mode Création, la version SQL donne le résultat qui suit :
 


On retrouve bien le Dossard fautif avec la série incriminée.
 



Exercice facultatif (facile) :
Trouver les concurrents inscrits à une épreuve pour laquelle ils n'ont pas été regroupés dans une série lui correspondant…

 

FIN

Retour au sommaire du Travail Pratique Access