Bonjour,
Je vous propose un nouvel élément à utiliser : Simuler le comportement d'un FULL OUTER JOIN
MySQL autorise les jointures externes à gauche (LEFT [OUTER] JOIN) et à droite (RIGHT [OUTER] JOIN), mais pas la jointure externe totale. Cette jointure ramène toutes les valeurs des tables jointes, complétant les colonnes de l'une par NULL quand il n'y a pas de correspondance avec l'autre table.
Supposons que nous ayons les deux tables suivantes :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 CREATE TABLE tableA ( id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, nom varchar(45) NOT NULL, PRIMARY KEY (id) ); CREATE TABLE tableB ( id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, nom varchar(45) NOT NULL, PRIMARY KEY (id) );
Et le jeu de données suivant :
On souhaite obtenir toutes les lignes des tables A et B ayant un nom identique, ainsi que les lignes de A sans nom équivalent dans B et les lignes de B sans nom équivalent dans A.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 INSERT INTO tableA (nom) VALUES ('1'), ('2'), ('4'), ('5'), ('6'), ('6'), ('8'); INSERT INTO tableB (nom) VALUES ('1'), ('3'), ('4'), ('4'), ('7'), ('7'), ('8');
On peut alors exécuter la requête suivante :
Cette requête suppose que la version de MySQL supporte la clause UNION (MySQL version 4.0 minimum).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 SELECT a.nom, b.nom FROM tableA a LEFT OUTER JOIN tableB b ON a.nom = b.nom UNION ALL SELECT a.nom, b.nom FROM tableA a RIGHT OUTER JOIN tableB b ON a.nom = b.nom WHERE a.nom IS NULL
Qu'en pensez-vous ?
Partager