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 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