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 :
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 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 : 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
Cette requête suppose que la version de MySQL supporte la clause UNION (MySQL version 4.0 minimum).

Qu'en pensez-vous ?