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
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
lngIdGroupe | strNomGroupe
--------------------------
1           | Groupe1
2           | Groupe2
3           | Groupe3
Table Elements
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
Le but étant d'obtenir, pour chaque groupe, les 3 élements ayant la plus forte valeur.
M'inspirant librement de la requête du tutoriel, j'ai écrit celle-ci :

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
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
 
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           |              |               |
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 !).
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.