Simuler le comportement d'un FULL OUTER JOIN
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:
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 :
Code:
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 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.
On peut alors exécuter la requête suivante :
Code:
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 |
Cette requête suppose que la version de MySQL supporte la clause UNION (MySQL version 4.0 minimum).
Qu'en pensez-vous ?