Si je comprends bien, tous RIGHT JOIN
:
SELECT Persons.*, Orders.*
FROM Orders
RIGHT JOIN Persons ON Orders.PersonID = Persons.ID
peut être exprimé comme LEFT JOIN
:
SELECT Persons.*, Orders.*
FROM Persons
LEFT JOIN Orders ON Persons.ID = Orders.PersonID
Mon opinion personnelle est que l'intention de la déclaration:
- Obtenez d'abord le
Persons
- Puis développez / répétez le
Persons
si nécessaire afin de faire correspondre leOrders
est mieux exprimé par l'ordre de Persons LEFT JOIN Orders
que par l'ordre inverse Orders RIGHT JOIN Persons
(et je n'utilise jamais RIGHT JOIN
en conséquence).
Y a-t-il des situations où un RIGHT JOIN
est préféré? Ou, existe-t-il des cas d'utilisation où RIGHT JOIN
peut faire quelque chose qui LEFT JOIN
ne peut pas?
database-design
sql
relational-database
Zev Spitz
la source
la source
RIGHT JOIN
c'est recommandé ou plus courant. Si c'est votre prémisse, c'est incorrect. Je ne peux pas penser à un moment où j'ai jamais vu la bonne jointure utilisée dans le code ni dans les exemples. C'estJOIN
ouLEFT OUTER JOIN
. Dans de rares cas, vous pourriez voir unFULL OUTER JOIN
.Réponses:
Cela dépend de l'exigence que vous essayez de remplir.
Ce n'est pas la même chose de dire: "donnez-moi toutes les personnes et leurs commandes correspondantes" que "je veux toutes les commandes avec leurs personnes correspondantes" , en particulier si vous allez utiliser
is null
pour apporter des lignes sans correspondance correspondante. C'est ce que j'appelle la "table dominante", qui est la table à partir de laquelle je veux récupérer des lignes, même s'il n'y a pas de ligne correspondante de l'autre côté de la jointure.Regardez ces images et vous remarquerez qu'elles ne sont pas les mêmes:
La source de l'image est cet excellent article .
Mais vous avez raison en ce sens que les deux exigences peuvent être remplies avec l'une ou l'autre jointure en inversant simplement l'ordre des tables dans la jointure.
Mais je suppose que pour les occidentaux habitués à écrire de gauche à droite, il est plus naturel d'utiliser les jointures gauches sur les jointures droites , car nous voyons comme si nous voulions que les jointures soient dans le même sens ou dans le même ordre que les
select
colonnes ed.Donc, une raison possible de préférer une jointure droite est parce que dans votre culture, vous écrivez de droite à gauche (comme dans les systèmes d'écriture arabe ou hébreu) et vous avez tendance à penser de cette façon, ce qui signifie peut-être dans votre cerveau que les informations textuelles circulent de droite à gauche. .
Certains linguistes pensent que votre langue influence votre façon de penser: https://www.edge.org/conversation/lera_boroditsky-how-does-our-language-shape-the-way-we-think
la source
LEFT JOIN
plus naturel.Il n'y a rien (que je sache) qui puisse être fait avec une jointure droite qui ne puisse pas être fait avec une jointure gauche. Mais parfois, la syntaxe avec les jointures gauches est plus laide. Disons que vous disposez des tableaux suivants:
Disons que vous devez obtenir une liste de toutes les personnes dans votre base de données et de toutes les commandes qu'elles ont avec des détails de commande spéciaux (nous dirons que toutes les commandes n'ont pas de détails de commande spéciaux). Donc, vous feriez normalement une jointure gauche des gens aux ordres. Mais alors vous devez vous joindre à des détails de commande spéciaux. Si vous utilisez une jointure interne là-bas, cela ferait effectivement de la jointure gauche des personnes aux commandes une jointure interne. IE: c'est ce que vous voulez faire mais cela ne fonctionne pas (cela exclura toute personne qui n'a pas de commande spéciale):
Vous pouvez donc le réécrire comme ceci:
Pas exactement clair (en supposant aucun commentaire), mais il fait le travail. S'il s'agit de quelque chose de plus que ponctuel (c'est-à-dire quelque chose que quelqu'un devra revenir et entretenir un jour), l'utilisation d'une jointure droite pourrait rendre plus claire l'intention.
Ce qui est un peu plus succinct et clair (mais seulement si celui qui le lit comprend les bonnes jointures). Notez que cela peut être écrit avec des jointures gauches, mais cela nécessite une jointure imbriquée (que moins de personnes connaissent probablement que les jointures droites).
À ce stade, il s'agit de choisir ce qui est le plus clair et ce que la plupart des gens comprendront (sauriez-vous comment rechercher cette syntaxe sur Google si vous ne saviez pas qu'elle s'appelait une jointure imbriquée?).
En bref, vous n'avez pas strictement besoin de jointures correctes, mais elles pourraient faciliter la lecture.
la source
SELECT p.*, o.*, d.* FROM Persons p LEFT JOIN Orders o ON o.CustomerID = p.ID LEFT JOIN SpecialOrders d ON o.Id = d.OrderID
.Je pouvais voir un RIGHT JOIN utilisé à des fins de réplication / fusion. Disons que j'ai deux tables A et B. A est à gauche et B à droite. Disons que je voulais répliquer des données entre ces deux tables pour les rendre équivalentes.
Si je voulais montrer toutes les données qui étaient en A mais pas en B, ce serait une jointure GAUCHE. Si je voulais montrer toutes les données en B qui n'étaient pas en A, elles se rejoindraient à DROITE.
Ainsi, LEFT et RIGHT sont parfois utiles lors de la fusion et de la réplication de données pour garder les choses en perspective.
En dehors de cela, je ne vois aucune autre raison d'utiliser une jointure DROITE car toutes les jointures DROITES peuvent être converties en jointures GAUCHE ou vice versa, toutes les jointures GAUCHE peuvent être converties en jointures DROITES selon la façon dont les tables sont ordonnées ou visualisées. Ce serait donc une question de préférence dans d'autres cas.
Voici un bon lien pour visualiser les jointures SQL.
http://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins
la source
la jointure gauche n'est pas l'opposé de la jointure droite, vérifiez le cas suivant qui donne des résultats différents
les tables b anc c sont toujours jointes à l'intérieur mais dans la première a est joint à gauche aux autres et sur la seconde a est joint à droite
la jointure gauche ne renvoie aucune ligne tandis que la jointure droite renvoie une ligne
la source
Il n'y a jamais de raison de préférer
RIGHT JOIN
, etLEFT JOIN
c'est beaucoup plus clair:car il vous permet de voir immédiatement quelle table est interrogée. Alors qu'avec
RIGHT JOIN
:le premier tableau est écrit après le
JOIN
.D'après mon expérience, je n'en ai jamais vu
RIGHT JOIN
.la source
RIGHT JOIN
? .