Bonjour,
en parcourant hier un tutoriel trouvé sur le site de Microsoft, je suis tombé sur une mise en application intéressante des sous-requêtes corrélées et je me demandais s'il serait possible de réaliser la même chose en jointures.
Pour tester tout ça, j'ai créé un modèle alimenté de quelques données :
Table Groupes
Table Elements
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 lngIdGroupe | strNomGroupe -------------------------- 1 | Groupe1 2 | Groupe2 3 | Groupe3
Le but étant d'obtenir, pour chaque groupe, les 3 élements ayant la plus forte valeur.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 lngIdGroupe | lngIdElement | strNomElement | lngValeurElement ------------------------------------------------------------- 1 | 1 | Element1 | 15 1 | 2 | Element2 | 20 2 | 3 | Element3 | 5 2 | 4 | Element4 | 20 1 | 5 | Element5 | 15 1 | 6 | Element6 | 20
M'inspirant librement de la requête du tutoriel, j'ai écrit celle-ci :
Le résultat est donc le suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 SELECT G.strNomGroupe, G.lngIdGroupe, E.lngIdElement, E.strNomElement, E.lngValeurElement FROM Groupes AS G LEFT JOIN Elements AS E ON E.lngIdGroupe = G.lngIdGroupe WHERE E.lngIdElement IS NULL OR E.lngIdElement IN (SELECT TOP 3 lngIdElement FROM Elements WHERE lngIdGroupe = E.lngIdGroupe ORDER BY lngValeurElement DESC, lngIdElement ASC) ORDER BY G.strNomGroupe ASC, G.lngIdGroupe ASC, E.lngValeurElement DESC
Employant rarement des sous-requêtes corrélées dans la clause WHERE, je dois dire que j'ai été assez bluffé par cette utilisation suggérée par le tutoriel (Comme quoi, on en apprend tous les jours !).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 strNomGroupe | lngIdGroupe | lngIdElement | strNomElement | lngValeurElement ---------------------------------------------------------------------------- Groupe1 | 1 | 6 | Element6 | 20 Groupe1 | 1 | 2 | Element2 | 20 Groupe1 | 1 | 1 | Element1 | 15 Groupe2 | 2 | 4 | Element4 | 20 Groupe2 | 2 | 3 | Element3 | 5 Groupe3 | 3 | | |
Une fois la surprise passée, j'ai commencé à me demander s'il serait possible d'obtenir le même résultat autrement, avec une jointure par exemple. Qu'en pensez-vous ?
Merci d'avance pour vos lumières.
Partager