it-swarm.com.de

Grund, RIGHT JOIN gegenüber LEFT JOIN vorzuziehen

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 Erklärung:

  • Holen Sie sich zuerst die Persons
  • Erweitern/wiederholen Sie dann das Persons nach Bedarf, um es an das Orders anzupassen

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

Gibt es Situationen, in denen ein RIGHT JOIN Ist bevorzugt? Oder gibt es Anwendungsfälle, in denen RIGHT JOIN kann etwas tun, das LEFT JOIN kann nicht?

18
Zev Spitz

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

Es ist nicht dasselbe zu sagen: "gib mir alle Personen und ihre entsprechenden Befehle" dass "Ich möchte alle Befehle mit ihren entsprechenden Personen", besonders wenn du es bist werde is null, um Zeilen ohne entsprechende Übereinstimmung zu bringen. Das nenne ich die "dominante Tabelle". Dies ist die Tabelle, aus 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:

(enter image description here

Bildquelle ist dieser ausgezeichnete Artikel .

Sie haben jedoch Recht, dass beide Anforderungen erfüllt werden können, indem jeder Join nur die Reihenfolge der Tabellen im Join invertiert.

Aber ich denke, dass es für westliche Leute, die daran gewöhnt sind, von links nach rechts zu schreiben, natürlicher ist, linke Verknüpfungen über rechte Verknüpfungen zu verwenden, da wir so sehen, als ob Wir möchten, dass die Verknüpfungen in derselben Richtung oder in derselben Reihenfolge wie die selected-Spalten sind.

Ein möglicher Grund, einen rechten Join zu bevorzugen, ist , weil Sie in Ihrer Kultur von rechts nach links schreiben (wie in den arabischen oder hebräischen Schriftsystemen) und Sie neigen dazu, 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

11

Es gibt nichts (von dem ich weiß), was mit einem rechten Join gemacht werden kann, das mit einem linken Join nicht gemacht werden kann. Aber manchmal ist die Syntax mit Linksverknüpfungen hässlicher. Angenommen, Sie haben die folgenden Tabellen:

Persons
ID | Name

Orders
ID | CustomerId | other unimportant stuff

SpecialOrderDetails
ID | OrderId | other stuff

Angenommen, Sie müssen eine Liste aller Personen in Ihrer Datenbank und aller Bestellungen mit speziellen Bestelldetails erhalten (wir werden sagen, dass nicht alle Bestellungen spezielle Bestelldetails enthalten). Normalerweise würden Sie also eine Linksverbindung von Personen zu Bestellungen durchführen. Aber dann müssen Sie spezielle Bestelldetails eingeben. Wenn Sie dort eine innere Verknüpfung verwenden, wird die linke Verknüpfung von Personen zu Befehlen effektiv zu einer inneren Verknüpfung. IE: Dies ist, was Sie tun möchten, aber nicht funktioniert (es schließt jeden aus, 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önnen es also folgendermaßen 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 ganz klar (vorausgesetzt, keine Kommentare), aber es macht den Job. Wenn dies mehr als eine einmalige Sache ist (dh etwas, das jemand eines Tages zurückkommen und warten muss), kann die Verwendung einer richtigen Verknüpfung 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 derjenige, der es liest, die richtigen Verbindungen versteht). Beachten Sie, dass dies mit linken Verknüpfungen geschrieben werden kann, jedoch eine verschachtelte Verknüpfung erforderlich ist (mit der wahrscheinlich weniger Personen vertraut sind als mit rechten Verknüpfungen).

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 Menschen verstehen werden (würden Sie wissen, wie man diese Syntax googelt, wenn Sie nicht wissen, dass sie als verschachtelter Join bezeichnet wird?).

Kurz gesagt, Sie haben nicht unbedingt brauchen richtige Verknüpfungen, aber sie könnten das Lesen erleichtern.

3
Becuzz