2009-03-27 8 views
35

J'utilise INNER JOIN et LEFT OUTER JOINs tout le temps. Cependant, je n'ai jamais l'air d'avoir besoin de RIGHT OUTER JOINs, jamais.Est-ce que quelqu'un utilise des jonctions extérieures droites?

J'ai vu beaucoup de méchant SQL auto-généré qui utilise des jointures droites, mais pour moi, ce code est impossible de me faire 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?

+0

Relatif: http: // s tackoverflow.com/questions/436345/when-or-why-would-you-use-a-right-outer-join-instead-of-left – Thilo

Répondre

25

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

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

Si vous souhaitez renvoyer toutes les lignes de la bonne table, 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 à droite.

+11

Je trouve toujours plus logique de commencer avec la table qui contient tous les éléments non-orphelins, donc je finis toujours par utiliser LEFT JOIN. Je me demande si c'est une chose culturelle? –

+5

+1, les jointures externes gauche et droite sont exactement les mêmes que celles opposées. –

+1

@MatthieuF: Peut-être que c'est culturel. Utiliser la jointure droite donne l'impression de faire quelque chose de manière inverse. Cela vient sans penser à moi au moins, de toujours arranger mes jointures de manière à ce que (si nécessaire) la gauche rejoigne la situation. Je ne sais pas pourquoi? :-) – Petros

6

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

9

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

+0

Pouvez-vous s'il vous plaît fournir plus de détails? – Shabbyrobe

+0

Consultez cet article. http://www.devx.com/dbzone/Article/17403/0/page/5 –

+17

Je trouve que cette réponse fait que les jointures à droite ont un son spécial quand elles ne le sont pas. Les jointures externes gauche et droite sont des images inversées les unes des autres, toutes deux utiles pour trouver des objets orphelins. Le choix de l'utilisation est simplement basé sur la table dont vous voulez que toutes les lignes, même s'il n'y a pas de correspondance. –

1

Notre pratique standard ici est d'écrire tout en termes de JOINs GAUCHE si possible. Nous avons parfois utilisé FULL OUTER JOINs si nous en avions besoin, mais jamais JOIN JOINTS.

2

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

2

Je n'utilise que la gauche, mais permettez-moi de dire qu'ils sont vraiment les mêmes selon la façon dont vous commandez les choses. J'ai travaillé avec des gens qui n'utilisaient que juste, parce qu'ils construisaient des requêtes de l'intérieur et aimaient garder leurs articles principaux en bas, alors dans leur esprit, il était logique de n'utiliser que les bons.

I.e.

Got principal ici

besoin de plus indésirable

Plus indésirable jointure externe droite principale Stuff

Je préfère faire des choses alors principal ordure ... Alors, gauche œuvres extérieures pour moi.

Ainsi tout ce qui flotte votre bateau.

1

Vous pouvez effectuer la même chose en utilisant les jointures GAUCHE ou DROITE. En général, la plupart des gens pensent en termes de jointure GAUCHE probablement parce que nous lisons de gauche à droite. Cela revient vraiment à être cohérent. Votre équipe devrait se concentrer sur l'utilisation de jointures GAUCHE ou DROITE, pas les deux, car elles sont essentiellement la même chose, écrites différemment.

1

Rarement, comme indiqué, vous pouvez généralement réorganiser et utiliser une jointure à gauche. Aussi j'ai naturellement tendance à ordonner les données, de sorte que les jointures à gauche fonctionnent pour obtenir les données dont j'ai besoin. Je pense que la même chose peut être dite des jointures externes et croisées, la plupart des gens ont tendance à rester loin d'eux.

24

Pour donner un exemple où un RIGHT JOIN peut être utile.Supposons qu'il existe trois tables pour les personnes, les animaux de compagnie et les accessoires pour animaux de compagnie. Les gens peuvent éventuellement avoir des animaux et ces animaux peuvent é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 un résultat énumérant toutes les personnes, indépendamment de si oui ou non ils possèdent un animal de compagnie et des informations sur les animaux dont ils sont propriétaires qui ont également des accessoires .

Ce ne

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; 

Ce 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; 

fonctionne pas (A l'exclusion de Bob) Cette fonctionne (mais la syntaxe est beaucoup moins communément compris car il nécessite deux clauses ON successivement pour atteindre l'ordre de jointure logique souhaité)

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 le plus facile probablement d'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; 

Bien que si déterminé à éviter cette autre option serait d'introduire une table dérivée qui 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 Fiddles: MySQL, PostgreSQL, SQL Server

+0

Si vous ne comprenez pas pourquoi le pauvre Bob a été exclu, cela m'a aidé: http: // weblogs.sqlteam.com/jeffs/archive/2007/10/11/mixing-inner-outer-joins-sql.aspx – Luke

+0

@Luke - Coïncident que nous avons tous les deux utilisé un exemple "animaux de compagnie"! –

Questions connexes