Combinaisons de jointures INNER et OUTER
par
, 23/11/2020 à 17h22 (524 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 :
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 INNER JOIN T3 ON critères de jointure T3/T2 ON critères de joiture T2/T1
Dans le premier cas, on construit T1 left (T2 inner T3)
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 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 :
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
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 )
Le résultat est celui attendu, les colonnes marquées "null" confirment la mise en oeuvre d'une jointure externe (OUTER JOIN) :
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
Pièce jointe 584768
Qu'en est-il avec l'autre syntaxe ?
Plus de marqueur "null", ma requête est traitée comme une jointure interne (INNER JOIN) :
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 ;
Pièce jointe 584769