Vote des utilisateurs
					
					
	
0 
0 
						Détails
					
					Licence : Non renseignée
						Mise en ligne le 13 février 2011
												
																		
													Langue : Français
						
					
							Référencé dans
						
						
										
					
						Navigation
					
					
				
						
							
							
								Simuler le comportement d'un FULL OUTER JOIN							
						 
					
					
								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
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
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
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).
					
										
					
					
							Supposons que nous ayons les deux tables suivantes
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
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
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).
Salut, 
Non, c'est différent à chaque fois que la relation entre A et B n'est pas 1 - 1
(Le right join, c'est avant tout un joint donc tu vas démultiplier toutes tes lignes)
					Non, c'est différent à chaque fois que la relation entre A et B n'est pas 1 - 1
(Le right join, c'est avant tout un joint donc tu vas démultiplier toutes tes lignes)
c'est sympa d'avoir une jointure externe totale mais je vois pas quand on peut l'utiliser ET union est tellement pas pratique à utiliser que je n'utiliserai pas ça.
J'ai l'impression qu'un enchainement judicieux d'outer join ferait la même chose. Est ce que j'ai tord?
genre t1 LEFT JOIN t2 RIGHT JOIN t2...
					J'ai l'impression qu'un enchainement judicieux d'outer join ferait la même chose. Est ce que j'ai tord?
genre t1 LEFT JOIN t2 RIGHT JOIN t2...
Developpez.com décline toute responsabilité quant à l'utilisation des différents éléments téléchargés.