Pour donner un exemple où un RIGHT JOIN
peut être utile.
Supposons qu'il y a trois tables pour les Personnes, les Animaux et Accessoires pour Animaux de compagnie. Les gens peuvent éventuellement avoir des animaux de compagnie et vos animaux de compagnie peut éventuellement avoir des accessoires
CREATE TABLE Persons
(
PersonName VARCHAR(10) PRIMARY KEY
);
INSERT INTO Persons
VALUES ('Alice'),
('Bob'),
('Charles');
CREATE TABLE Pets
(
PetName VARCHAR(10) PRIMARY KEY,
PersonName VARCHAR(10)
);
INSERT INTO Pets
VALUES ('Rover',
'Alice'),
('Lassie',
'Alice'),
('Fifi',
'Charles');
CREATE TABLE PetAccessories
(
AccessoryName VARCHAR(10) PRIMARY KEY,
PetName VARCHAR(10)
);
INSERT INTO PetAccessories
VALUES ('Ball', 'Rover'),
('Bone', 'Rover'),
('Mouse','Fifi');
Si l'exigence est d'obtenir une liste de résultats de toutes les personnes, indépendamment de si oui ou non ils ont un animal de compagnie, et des informations sur tous les animaux qu'ils possèdent, qui possèdent également des accessoires.
Cela ne fonctionne pas (à l'exclusion de Bob)
SELECT P.PersonName,
Pt.PetName,
Pa.AccessoryName
FROM Persons P
LEFT JOIN Pets Pt
ON P.PersonName = Pt.PersonName
INNER JOIN PetAccessories Pa
ON Pt.PetName = Pa.PetName;
Cela ne fonctionne pas (Comprend Lassie)
SELECT P.PersonName,
Pt.PetName,
Pa.AccessoryName
FROM Persons P
LEFT JOIN Pets Pt
ON P.PersonName = Pt.PersonName
LEFT JOIN PetAccessories Pa
ON Pt.PetName = Pa.PetName;
Ce n'travail (mais la syntaxe est beaucoup moins bien compris qu'il nécessite deux ON
des clauses de la succession d'atteindre les objectifs de logique joindre à la commande)
SELECT P.PersonName,
Pt.PetName,
Pa.AccessoryName
FROM Persons P
LEFT JOIN Pets Pt
INNER JOIN PetAccessories Pa
ON Pt.PetName = Pa.PetName
ON P.PersonName = Pt.PersonName;
Dans l'ensemble, probablement le plus facile à utiliser un RIGHT JOIN
SELECT P.PersonName,
Pt.PetName,
Pa.AccessoryName
FROM Pets Pt
JOIN PetAccessories Pa
ON Pt.PetName = Pa.PetName
RIGHT JOIN Persons P
ON P.PersonName = Pt.PersonName;
Mais si déterminé pour éviter cela, une autre option serait d'introduire une table dérivée peut être joint à gauche
SELECT P.PersonName,
T.PetName,
T.AccessoryName
FROM Persons P
LEFT JOIN (SELECT Pt.PetName,
Pa.AccessoryName,
Pt.PersonName
FROM Pets Pt
JOIN PetAccessories Pa
ON Pt.PetName = Pa.PetName) T
ON T.PersonName = P.PersonName;
SQL Violons: MySQL, PostgreSQL, SQL Server