Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Contribuez
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 13/02/2011, 13h31   #1
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 441
Points : 6 441
Par défaut 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 ?
__________________
Rédacteur / Modérateur SGBD
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2011, 10h45   #2
Membre Expert
 
Avatar de gene69
 
Inscription : janvier 2006
Messages : 951
Détails du profil
Informations personnelles :
Localisation : France

Informations professionnelles :
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : janvier 2006
Messages : 951
Points : 1 063
Points : 1 063
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...
__________________
PHP fait nativement la validation d'adresse électronique Vous êtes perdu en PHP? rassurez-vous ici (en)
Utilisez le bouton résolu!
gene69 est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 08/12/2011, 14h25   #3
Membre Expert
 
Avatar de pacmann
 
Homme Pacman Pacman
Business analyst
Inscription : juin 2004
Messages : 1 417
Détails du profil
Informations personnelles :
Nom : Homme Pacman Pacman
Âge : 31
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Business analyst
Secteur : Finance

Informations forums :
Inscription : juin 2004
Messages : 1 417
Points : 2 309
Points : 2 309
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)
__________________

(c'est ma photo)
Paku, Paku !
Pour les jeunes incultes : non, je ne suis pas un pokémon...

Le pacblog : http://pacmann.over-blog.com/
pacmann est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h12.


 
 
 
 
Partenaires

Hébergement Web