Joindre une table sur elle-même

Répondre
marial
le 21/09/2013 à 10:49
marial
Bonjour tout le monde,

Etant novice en SQL, je souhaiterais joindre une table sur elle-même, mais je ne sais comment procéder. J'ai lu des tutos sur internet mais je ne les ai pas trouvé très explicites ou détaillés.
Je signe je persiste
LupusMic
le 21/09/2013 à 17:07
LupusMic
Il y au moins deux type de jointures : laxiste (left) et stricte (right). Le type de jointure par défaut dépend souvent de l'implémentation, il est donc recommandé de préciser ce que tu veux.

Dans les exemples, j'utilise volontairement une notation indépendante de SQL, un peu plus mathématique. C'est pour épurer la démonstration des détails d'implémentation des bases SQL.
(a 0 1) signifie « ensemble 'a', ligne '0' colonne '1' ». C'est l'identifiant (les coordonnées) d'une donnée, ce n'est pas la donnée en elle-même.

Une jointure, c'est multiplier deux ensembles (produit cartésien):

Ensemble a:
(a 0 0) (a 0 1) (a 0 2)
(a 1 0) (a 1 1) (a 1 2)
(a 2 0) (a 2 1) (a 2 2)

Ensemble b:
(b 0 0) (b 0 1) (b 0 2)
(b 1 0) (b 1 1) (b 1 2)

Ensemble a×b

(a 0 0) (a 0 1) (a 0 2) (b 0 0) (b 0 1) (b 0 2)
(a 0 0) (a 0 1) (a 0 2) (b 1 0) (b 1 1) (b 1 2)
(a 1 0) (a 1 1) (a 1 2) (b 0 0) (b 0 1) (b 0 2)
(a 1 0) (a 1 1) (a 1 2) (b 1 0) (b 1 1) (b 1 2)
(a 2 0) (a 2 1) (a 2 2) (b 0 0) (b 0 1) (b 0 2)
(a 2 0) (a 2 1) (a 2 2) (b 1 0) (b 1 1) (b 1 2)


Comme tu peux le constater, tu dupliques chaque tuple (une ligne dans un ensemble de données) du premier ensemble autant de fois qu'il y a de tuples dans l'ensemble à joindre, et tu associe à chaque copie un tuple du second ensemble.

En SQL, ce serait l'équivalent de :

select * from a, b;


Les jointures, c'est un produit cartésien avec une condition de jonction.

Par exemple, tu peux dire que la colonne a.0 doit être égale à a.1 pour que les tuples puissent être associés. C'est là que tu auras une différence entre la jointure laxiste et la jointure stricte : dans le premier cas, si le critère n'est pas respecté, le tuple de l'ensemble associé sera nullifié ; dans le second cas, la ligne d'association sera retirée de l'ensemble résultant de la jointure.

Dans l'exemple, on considère que (a 0 0) égal (b 0 0).

Ensemble a×b si (a 0) égal (b 0) sinon null

(a 0 0) (a 0 1) (a 0 2) (b 0 0) (b 0 1) (b 0 2)
(a 1 0) (a 1 1) (a 1 2) ( null) ( null) ( null)
(a 2 0) (a 2 1) (a 2 2) ( null) ( null) ( null)


Ce qui équivaut à :

select * from a left join b on a.0 = b.0;


Ensemble a×b si (a 0) égal (b 0)
(a 0 0) (a 0 1) (a 0 2) (b 0 0) (b 0 1) (b 0 2)


Ce qui équivaut à :

select * from a right join b on a.0 = b.0;
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
Répondre

Ecrire un message

Votre message vient d'être créé avec succès.
LoadingChargement en cours