Grund, RIGHT JOIN gegenüber LEFT JOIN vorzuziehen

18

Wenn ich richtig verstehe, jeder RIGHT JOIN:

SELECT Persons.*, Orders.*
FROM Orders
RIGHT JOIN Persons ON Orders.PersonID = Persons.ID

kann ausgedrückt werden als LEFT JOIN:

SELECT Persons.*, Orders.*
FROM Persons
LEFT JOIN Orders ON Persons.ID = Orders.PersonID

Meine persönliche Meinung ist, dass die Absicht der Aussage ist:

  • Holen Sie sich zuerst die Persons
  • Erweitern / wiederholen Sie dann die Personserforderlichen Schritte, um sie an die anzupassenOrders

wird besser durch die Reihenfolge von ausgedrückt Persons LEFT JOIN Ordersals durch die umgekehrte Reihenfolge Orders RIGHT JOIN Persons(und ich benutze nie RIGHT JOINals Ergebnis).

Gibt es Situationen, in denen a RIGHT JOINbevorzugt wird? Oder gibt es Anwendungsfälle, in denen RIGHT JOINetwas LEFT JOINnicht möglich ist?

Zev Spitz
quelle
12
Ich kann mich nicht an einen Fall erinnern, in dem ich einen richtigen Beitritt wollte. Es gab Fälle, in denen der Ausführungsplan einer Abfrage aus Leistungsgründen einen linken Join in einen rechten Join umwandelte. Aber vom Standpunkt des reinen Code-Schreibens aus kann ich mich nicht erinnern, jemals einen richtigen Join geschrieben zu haben.
Brandon
2
Ich sehe dies nicht als eine Frage zum Erklären, Schreiben oder Debuggen von Code. Es wird gefragt, warum eine Sprache zwei Merkmale hat, die anscheinend dasselbe bewirken, wenn tatsächlich ein Unterschied zwischen ihnen besteht und wenn nicht, wenn das "nicht offensichtliche" bevorzugt wird.
Philip Kendall
1
Nein, ein linker Join erfasst fast immer genau das, was Sie am dringendsten benötigen, und ist einfacher zu überlegen. An meinem Arbeitsplatz gibt es tatsächlich einen Standard, um Rechtsverknüpfungen zu verhindern, da es nie einen Fall gibt, in dem sie erforderlich sind (dh sie können immer durch die entgegengesetzte Linksverknüpfung ersetzt werden).
mgw854
8
Ich habe die engen Abstimmungen zurückgesetzt - diese Frage ist hier zum Thema geworden, da das Verstehen des Unterschieds zwischen Verknüpfungen das Software-Design beeinflusst (das Datenbank-Design ist Teil des Software-Designs, ebenso wie Algorithmen, die Datenbanken abfragen können). Es kann auch ein Thema für Datenbankadministratoren sein , und es kann dort auch ein Duplikat geben.
Thomas Owens
1
Ich bin mir nicht sicher, ob Sie vorschlagen, dass dies RIGHT JOINempfohlen oder üblicher ist. Wenn das Ihre Prämisse ist, ist es falsch. Ich kann mir keine Zeit vorstellen, in der ich je einen richtigen Join gesehen habe, der weder in Code noch in Beispielen verwendet wird. Es ist JOINoder LEFT OUTER JOIN. In seltenen Fällen sehen Sie u FULL OUTER JOIN.
JimmyJames

Antworten:

12

Das hängt davon ab, welche Anforderung Sie erfüllen möchten.

Es ist nicht dasselbe zu sagen: "Gib allen Personen und ihren entsprechenden Befehlen etwas" , "Ich möchte alle Befehle mit ihren entsprechenden Personen" , insbesondere, wenn Sie is nullZeilen mit keinem entsprechenden Treffer bringen. Das nenne ich die "dominante Tabelle". Dies ist die Tabelle, von der ich Zeilen abrufen möchte, unabhängig davon, ob sich auf der anderen Seite des Joins keine entsprechende Zeile befindet.

Schauen Sie sich diese Bilder an und Sie werden feststellen, dass sie nicht gleich sind:

Bildbeschreibung hier eingeben

Quelle des Bildes ist dieser hervorragende Artikel .

Sie haben jedoch Recht, dass beide Anforderungen erfüllt werden können, wenn Sie entweder einen Join ausführen oder die Reihenfolge der Tabellen im Join umkehren.

Aber ich denke, dass es für westliche Leute, die es gewohnt sind, von links nach rechts zu schreiben, natürlicher ist, linke Verknüpfungen über rechte Verknüpfungen zu verwenden , da wir sehen , dass die Verknüpfungen in der gleichen Richtung oder in der gleichen Reihenfolge wie die selectSpalten ed sein sollen.

Ein möglicher Grund für die Bevorzugung einer rechten Verknüpfung ist, dass Sie in Ihrer Kultur von rechts nach links schreiben (wie in den arabischen oder hebräischen Schriftsystemen) und dass Sie dazu neigen, so zu denken, was bedeutet, dass Textinformationen in Ihrem Gehirn möglicherweise von rechts nach links fließen .

Einige Linguisten glauben, dass Ihre Sprache Ihre Denkweise beeinflusst: https://www.edge.org/conversation/lera_boroditsky-how-does-our-language-shape-the-way-we-think

Tulains Córdova
quelle
1
Ich hatte angefangen, in diese Richtung zu denken, aber ich denke nicht, dass es richtig ist. Ich begann mir vorzustellen, wie man SQL auf Hebräisch schreibt (was ich eigentlich nie getan habe). OK: rechtsbündig, von rechts nach links, von oben nach unten. Sie werden immer noch zuerst die Tabelle A und dann die Tabelle B erwähnen. Mit einem richtigen Join schließen Sie dann (besonders im Null-Fall) den größten Teil oder die gesamte zuerst erwähnte Tabelle aus. Ich denke, dass der menschliche Geist dazu neigt, sich zuerst mit dem Primären und Wichtigsten zu verbinden . Dies geschieht unabhängig von der Schreibrichtung. Sie könnten sie "FIRST JOIN" und "SECOND JOIN" nennen, und diese Verzerrung würde immer noch auftreten.
Mike unterstützt Monica
Ich habe einen Link zu dem Bild eingefügt, das Sie unten gezeigt haben.
Jon Raynor
@ Mike Ich schlage nicht vor, dass Leute SQL auf Arabisch oder Hebräisch schreiben. Nur, dass vielleicht die Orientierung Ihrer Muttersprache ein Grund für Sie sein könnte, sich lieber an die rechte Seite zu setzen. Das ist aber nur eine Möglichkeit. Ich finde Linksverbindungen natürlicher.
Tulains Córdova
Jetzt habe ich dem Schöpfer des Bildes die gebührende Anerkennung gegeben. Ich hatte es jahrelang in meiner
Huntington-Krankheit
Ich spreche fließend Hebräisch und finde es LEFT JOINnoch natürlicher.
Zev Spitz
3

Es gibt nichts (wovon ich weiß), das mit einer rechten Verknüpfung durchgeführt werden kann, das nicht mit einer linken Verknüpfung durchgeführt werden kann. Aber manchmal ist die Syntax mit Left Joins hässlicher. Angenommen, Sie haben die folgenden Tabellen:

Persons
ID | Name

Orders
ID | CustomerId | other unimportant stuff

SpecialOrderDetails
ID | OrderId | other stuff

Angenommen, Sie benötigen eine Liste aller Personen in Ihrer Datenbank und aller Bestellungen, die sie mit speziellen Bestelldetails haben (wir werden sagen, dass nicht alle Bestellungen spezielle Bestelldetails haben). Normalerweise führt man also einen Link-Join von Personen zu Befehlen durch. Dann müssen Sie jedoch spezielle Bestelldetails angeben. Wenn Sie dort einen inneren Join verwenden, wird der linke Join von Personen zu Befehlen in einen inneren Join umgewandelt. IE: Dies ist, was Sie tun möchten, aber nicht funktioniert (es wird jeden ausschließen, der keine spezielle Bestellung hat):

select p.*, o.*, d.*
from Persons p
left join Orders o on o.CustomerId = p.Id
inner join SpecialOrderDetails d on d.OrderId = o.Id

Sie könnten es also so umschreiben:

--get all the people without a special order
select p.*, NULL, NULL, ... --NULLs placeholders for all the fields from OrderDetails and SpecialOrderDetails
from Persons p
left join Orders o on o.CustomerId = p.Id
left join SpecialOrderDetails d on d.OrderId = o.Id
where o.Id is null 

union

--get all the people with a special order
select p.*, o.*, d.*
from Persons p
inner join Orders o on o.CustomerId = p.Id
inner join SpecialOrderDetails d on d.OrderId = o.Id

Nicht genau klar (vorausgesetzt, keine Kommentare), aber es macht den Job. Wenn dies mehr als eine einmalige Aktion ist (dh, jemand muss eines Tages zurückkehren und warten), könnte die Verwendung eines richtigen Joins klarer machen, was die Absicht war.

select p.*, o.*, d.*
from Orders o
inner join SpecialOrderDetails d on d.OrderId = o.Id
right join Persons p on p.Id = o.CustomerId

Was etwas prägnanter und klarer ist (aber nur, wenn jeder, der es liest, die richtigen Verknüpfungen versteht). Beachten Sie, dass dies mit Left-Joins geschrieben werden kann, jedoch ein verschachtelter Join erforderlich ist (mit dem wahrscheinlich weniger Leute vertraut sind als mit Right-Joins).

select p.*, o.*, d.*
from Persons p
left join Orders o 
    inner join SpecialOrderDetails d on d.OrderId = o.Id
on o.CustomerId = p.Id

An diesem Punkt können Sie auswählen, was am klarsten ist und was die meisten Leute verstehen werden.

Kurz gesagt, Sie benötigen nicht unbedingt die richtigen Verknüpfungen, aber sie erleichtern möglicherweise das Lesen.

Becuzz
quelle
Ich denke, vielleicht bist du nur Rechtshänder.
Robert Harvey
Ich folge nicht , warum Sie nicht mehr links schließt sich in diesem Fall schreiben: 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.
Zev Spitz
@RobertHarvey Ich bin, aber ich bin nicht sicher, was Händigkeit damit zu tun hat.
Becuzz
@ZevSpitz Vielleicht war es nicht klar, was ich geschrieben habe, aber die Idee war, dass Sie die Felder nur aus Aufträgen heraus haben wollten, wenn ein spezieller Auftragsdetailsatz existiert, d. H. Links verbinden sie nur, wenn das Paar von ihnen existiert.
Becuzz
-1

Ich konnte einen RECHTEN JOIN sehen, der für Replikations- / Zusammenführungszwecke verwendet wird. Nehmen wir an, ich habe zwei Tische A und B. A ist links und B ist rechts. Angenommen, ich wollte Daten zwischen diesen beiden Tabellen replizieren, um sie gleichwertig zu machen.

Wenn ich alle Daten anzeigen wollte, die in A, aber nicht in B waren, wäre dies eine LINKE Verknüpfung. Wenn ich alle Daten in B anzeigen wollte, die nicht in A waren, würde es sich RECHTS anschließen.

Daher sind LINKS und RECHTS manchmal nützlich, wenn Daten zusammengeführt und repliziert werden, um die Zukunft zu sichern.

Abgesehen davon sehe ich keinen anderen Grund für die Verwendung eines RIGHT-Joins, da alle RIGHT-Joins in LEFT-Joins konvertiert werden können oder umgekehrt alle LEFT-Joins in RIGHT-Joins konvertiert werden können, je nachdem, wie die Tabellen sortiert oder dargestellt werden. In anderen Fällen wäre es also eine Frage der Präferenz.

Hier ist ein schöner Link zur Visualisierung von SQL Joins.

http://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins

Jon Raynor
quelle
-1

left join ist nicht das Gegenteil von right join. Überprüfen Sie den folgenden Fall, der unterschiedliche Ergebnisse liefert

select * from 
(select 1 as x  where 1=1) a left join 
(select 1 as x  where 1=0) b on a.x=b.x inner join 
(select 1 as x  where 1=1) c on b.x=c.x

select * from 
(select 1 as x where 1=1) c inner join 
(select 1 as x where 1=0) b on c.x=b.x right join 
(select 1 as x where 1=1) a on b.x=a.x

Tabellen b und c sind immer inner verbunden, aber in der ersten wird a mit den anderen verbunden gelassen und in der zweiten wird a mit der rechten verbunden

left join gibt keine Zeilen zurück, right join gibt eine Zeile zurück

jacob s
quelle
dies liest sich eher wie ein tangentialer Kommentar, siehe Wie man antwortet
gnat
-2

Es gibt keinen Grund, es vorzuziehen RIGHT JOIN, und es LEFT JOINist viel klarer:

SELECT Persons. *, Orders. * FROM Persons LEFT JOIN Orders ON Persons.ID = Orders.PersonID

So können Sie sofort sehen, welche Tabelle abgefragt wird. Während mit RIGHT JOIN:

SELECT Persons. *, Orders. * FROM Orders RIGHT JOIN Persons ON Orders.PersonID = Persons.ID

Die erste Tabelle wird nach dem geschrieben JOIN.

Nach meiner Erfahrung habe ich noch nie einen gesehen RIGHT JOIN.

kirie
quelle
1
Was trägt dies zur Frage bei? Die Frage ist nicht, was ist der Unterschied? ; Die Frage ist, warum ich verwenden soll RIGHT JOIN? .
Zev Spitz
@ZevSpitz Du fragst nach dem Grund, welchen zu bevorzugen, ich gebe dir einen Grund. Welcher Anwendungsfall spielt keine Rolle, denn es ist Geschmackssache.
kirie