IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Voir le flux RSS

escartefigue

Combinaisons de jointures INNER et OUTER

Noter ce billet
par , 23/11/2020 à 18h22 (118 Affichages)
Voici un autre sujet qui revient de temps à autres, celui des requêtes incluant à la fois des jointures internes et externes.
Pour combiner ces deux types de jointures, il faut appliquer la syntaxe suivante :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
SELECT [...]
FROM T1
(FULL/LEFT/RIGTH) OUTER JOIN T2
    INNER JOIN T3   
       ON critères de jointure T3/T2
    ON critères de joiture T2/T1
Or, on rencontre souvent des requêtes écrites ainsi
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
SELECT [...]
FROM T1
(FULL/LEFT/RIGTH) OUTER JOIN T2
    ON critères de joiture T2/T1
INNER JOIN T3   
    ON critères de jointure T3/T2
Dans le premier cas, on construit T1 left (T2 inner T3)
Dans le deuxième, on construit (T1 left T2) inner T3

Pour bien voir la différence, vous pouvez copier-coller le jeu d'essai qui suit dans votre interpréteur SQL :

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
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
with CTE1 (id1, ch1, mt1) as                                  
    (select 001, 'ABC', 100.03           
     union all                                                
     select 002, 'DEF', 025.15           
     union all                                                
     select 003, 'IER', 305.22           
     union all                                                
     select 004, 'BGT', 602.00           
     union all                                                
     select 005, 'XAA', 780.15           
     union all                                                
     select 006, 'REE', 018.77           
     union all                                                
     select 007, 'AZE', 051.66       )   
  , CTE2 (id2, dt2, id1) as                               
   (select 001, '2018-01-05', 004    
    union all                                             
    select 004, '2018-01-10', 001    
    union all                                             
    select 002, '2018-01-12', 006    
    union all                                             
    select 005, '2018-01-13', 006    
    union all                                             
    select 006, '2018-01-20', 003   )     
  , CTE3 (id3, mt3, id2) as                                
   (select 001, 800, 001              
    union all                                              
    select 002, 250, 001              
    union all                                              
    select 003, 500, 005              
    union all                                              
    select 004, 200, 006              
    union all                                              
    select 005, 100, 006            )
Qu'obtient-on avec la première requête ?

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
    SELECT T1.ID1           
         , T1.MT1           
         , T1.CH1           
         , T2.ID2           
         , T2.DT2           
         , T3.MT3           
    FROM  CTE1 T1           
    LEFT  JOIN CTE2 T2      
          INNER JOIN CTE3 T3      
             ON T3.ID2 = T2.ID2   
      ON  T2.ID1 = T1.ID1
Le résultat est celui attendu, les colonnes marquées "null" confirment la mise en oeuvre d'une jointure externe (OUTER JOIN) :
Nom : Sans titre.png
Affichages : 38
Taille : 8,8 Ko

Qu'en est-il avec l'autre syntaxe ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
    SELECT T1.ID1           
         , T1.MT1           
         , T1.CH1           
         , T2.ID2           
         , T2.DT2           
         , T3.MT3           
    FROM  CTE1 T1           
    LEFT  JOIN CTE2 T2      
      ON  T2.ID1 = T1.ID1  
    INNER JOIN CTE3 T3      
      ON  T3.ID2 = T2.ID2
    ;
Plus de marqueur "null", ma requête est traitée comme une jointure interne (INNER JOIN) :
Nom : Sans titre.png
Affichages : 33
Taille : 5,0 Ko

Envoyer le billet « Combinaisons de jointures INNER et OUTER » dans le blog Viadeo Envoyer le billet « Combinaisons de jointures INNER et OUTER » dans le blog Twitter Envoyer le billet « Combinaisons de jointures INNER et OUTER » dans le blog Google Envoyer le billet « Combinaisons de jointures INNER et OUTER » dans le blog Facebook Envoyer le billet « Combinaisons de jointures INNER et OUTER » dans le blog Digg Envoyer le billet « Combinaisons de jointures INNER et OUTER » dans le blog Delicious Envoyer le billet « Combinaisons de jointures INNER et OUTER » dans le blog MySpace Envoyer le billet « Combinaisons de jointures INNER et OUTER » dans le blog Yahoo

Catégories
Sans catégorie

Commentaires