Ociensa

Formation SQL - Article "Clause ON versus WHERE dans les jointures internes et externes"

Cet article vient en complément de notre formation SQL. Dans la syntaxe normalisée des jointures, le critère de jointure est placé derrière le ON, tandis que les critères supplémentaires sont placés derrière le WHERE.
Dans l'exemple ci-dessous, nous montrons la différence entre a) Placer le critère supplémentaire derrière le WHERE et b) Placer le critère supplémentaire derrière le ON.
Dans cet exemple, il s'agit d'afficher la liste des conférences (table csession) et la liste des personnes inscrites à ces conférences (inscrip).

MCD Table csession Table inscrip

Jointure interne

Jointure externe

Dans une jointure interne, on obtient uniquement les enregistrement qui ont au moins une correspondance dans chaque table.

a) Jointure interne simple

Le résultat ne contient que les sessions ayant au moins un inscrit.

SELECT c.codecsession, codecours, datedebut, codeinscrip, nom
FROM csession c join inscrip i
on c.codecsession = i.codecsession
order by codecsession ;

Seules les sessions 1, 2, 5, 6 , 11 , 16, 20, 22, 24, 25 ont des inscrits :

Dans une jointure externe gauche, on obtient déjà le résultat de la jointure interne, auquel se rajoute les enregistrement de la table de gauche, qui n'ont pas de correspondance dans la table de droite.

d) Jointure externe simple

Le résultat contient toutes les sessions, même celles qui n'ont aucun inscript (colonne codeinscrip à NULL)

SELECT c.codecsession, codecours, datedebut, codeinscrip, nom
FROM csession c left outer join inscrip i
on c.codecsession = i.codecsession ;

Les sessions 1 à 25 apparaissent à l'écran :

b) Jointure interne avec le critère de jointure + un critère supplémentaire (WHERE)

Afficher uniquement les codes de session compris entre 1 et 10 :

La bonne requête : Le WHERE permet de filtrer le résultat précédent.

SELECT c.codecsession, codecours, datedebut, codeinscrip, nom
FROM csession c join inscrip i
on c.codecsession = i.codecsession
where c.codecsession between 1 and 10 ;

c) Jointure interne avec le critère de jointure + un critère supplémentaire (ON)

Cette solution est donc incorrecte. Mais :
Malgré que cela ne soit pas dans l'esprit du ON (ON sert à exprimer le critère de jointure uniquement), on obtiendra le même résultat dans le cas d'une jointure interne :

SELECT c.codecsession, codecours, datedebut, codeinscrip, nom
FROM csession c join inscrip i
on c.codecsession = i.codecsession
and c.codecsession between 1 and 10 ;

Résultat :

e) Jointure externe avec le critère de jointure + un critère supplémentaire (WHERE)

Afficher uniquement les codes de session compris entre 1 et 10 :

SELECT c.codecsession, codecours, datedebut, codeinscrip, nom
FROM csession c left outer join inscrip i
on c.codecsession = i.codecsession
where c.codecsession between 1 and 10 ;

Ici, on filtre simplement le résultat précédent ; on conserve uniquement les sessions comprises entre 1 et 10

f) Jointure externe avec le critère de jointure + un critère supplémentaire (ON)

Afficher uniquement les codes de session compris entre 1 et 10 :

SELECT c.codecsession, codecours, datedebut, codeinscrip, nom
FROM csession c left outer join inscrip i
on c.codecsession = i.codecsession
and c.codecsession between 1 and 10 ;

On obtient le résultat de la jointure interne vue au point c) auquel s'ajoutent tous les enregistrements de la table csession qui n'ont pas de coorrespondance avec la table inscrip. Cette solution est donc incorrecte.

 


Copyright Ociensa Technologies - 1.0 24/07/2008