41 votes

Est-ce que quelqu'un utilise les jointures externes droites?

J'utilise INNER JOIN et LEFT OUTER JOINs tout le temps. Cependant, je ne semble jamais avoir besoin de JOINDRE EXTERNES DROITS, jamais.

J'ai vu plein de vilains SQL générés automatiquement qui utilisent des jointures correctes, mais pour moi, ce code est impossible à comprendre. J'ai toujours besoin de le réécrire en utilisant des jointures internes et gauches pour en faire des têtes ou des queues.

Est-ce que quelqu'un écrit réellement des requêtes en utilisant des jointures à droite?

33voto

Martin Smith Points 174101

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

26voto

Petros Points 4430

Cela dépend de quel côté de la jointure vous mettez chaque table.

Si vous souhaitez renvoyer toutes les lignes de la table de gauche, même s'il n'y a pas de correspondance dans la table de droite ... vous utilisez la jointure gauche.

Si vous souhaitez renvoyer toutes les lignes de la table de droite, même s'il n'y a pas de correspondance dans la table de gauche, vous utilisez la jointure droite.

Fait intéressant, j'ai rarement utilisé des jointures correctes.

7voto

Ólafur Waage Points 40104

Vous utilisez généralement RIGHT OUTER JOINS pour rechercher des éléments orphelins dans d'autres tables.

4voto

Eppz Points 1907

Non, je ne le fais pas pour la simple raison que je peux tout accomplir avec des jointures internes ou gauches.

2voto

Kevin Points 57797

La seule fois où j'utilise une jointure externe Droite, c'est lorsque je travaille sur une requête existante et que je dois la modifier (normalement à partir d'une interne). Je pourrais inverser la jointure et en faire une gauche et probablement être ok, mais j'essaie de réduire le nombre de choses que je change lorsque je modifie le code.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X