it-swarm.com.de

Wann oder warum würden Sie eine rechte äußere Verknüpfung anstelle einer linken verwenden?

Wikipedia Staaten:

"In der Praxis werden explizite rechte äußere Verknüpfungen selten verwendet, da sie immer durch linke äußere Verknüpfungen ersetzt werden können und keine zusätzliche Funktionalität bieten."

Kann jemand eine Situation angeben, in der er die RECHTE Notation bevorzugt hat und warum? Ich kann mir keinen Grund vorstellen, es jemals zu benutzen. Für mich würde es die Dinge niemals klarer machen.

Bearbeiten: Ich bin ein Oracle-Veteran, der die Neujahrsentscheidung trifft, mich von der (+) - Syntax abzusetzen. Ich möchte es richtig machen

45
DCookie

Der einzige Grund, den ich mir vorstellen kann, RIGHT OUTER JOIN zu verwenden, ist der Versuch, Ihre SQL-Dokumentation selbst zu dokumentieren.

Möglicherweise möchten Sie Linksverknüpfungen für Abfragen verwenden, die Nullzeilen auf der abhängigen (vielen) Seite von Eins-zu-Viele-Beziehungen und Rechtsverknüpfungen für Abfragen enthalten, die Nullzeilen auf der unabhängigen Seite generieren.

Dies kann auch in generiertem Code vorkommen oder wenn die Codierungsanforderungen eines Shops die Reihenfolge der Deklaration von Tabellen in der FROM-Klausel angeben.

31

Ich habe noch nie right join verwendet und hätte nie gedacht, dass ich es wirklich brauchen könnte, und es wirkt ein bisschen unnatürlich. Aber nachdem ich darüber nachgedacht habe, könnte es in der Situation sehr nützlich sein, wenn Sie eine Tabelle mit einer Schnittmenge von vielen Tabellen verbinden müssen, so dass Sie Tabellen wie diese haben:

enter image description here

Und möchte das Ergebnis so erhalten:

enter image description here

Oder in SQL (MS SQL Server):

declare @temp_a table (id int)
declare @temp_b table (id int)
declare @temp_c table (id int)
declare @temp_d table (id int)

insert into @temp_a
select 1 union all
select 2 union all
select 3 union all
select 4

insert into @temp_b
select 2 union all
select 3 union all
select 5

insert into @temp_c
select 1 union all
select 2 union all
select 4

insert into @temp_d
select id from @temp_a
union
select id from @temp_b
union
select id from @temp_c

select *
from @temp_a as a
    inner join @temp_b as b on b.id = a.id
    inner join @temp_c as c on c.id = a.id
    right outer join @temp_d as d on d.id = a.id

id          id          id          id
----------- ----------- ----------- -----------
NULL        NULL        NULL        1
2           2           2           2
NULL        NULL        NULL        3
NULL        NULL        NULL        4
NULL        NULL        NULL        5

Wenn Sie also zum left join wechseln, werden die Ergebnisse nicht gleich sein.

select *
from @temp_d as d
    left outer join @temp_a as a on a.id = d.id
    left outer join @temp_b as b on b.id = d.id
    left outer join @temp_c as c on c.id = d.id

id          id          id          id
----------- ----------- ----------- -----------
1           1           NULL        1
2           2           2           2
3           3           3           NULL
4           4           NULL        4
5           NULL        5           NULL

Die einzige Möglichkeit, dies ohne den richtigen Join zu tun, ist die Verwendung eines allgemeinen Tabellenausdrucks oder einer Unterabfrage

select *
from @temp_d as d
    left outer join (
        select *
        from @temp_a as a
            inner join @temp_b as b on b.id = a.id
            inner join @temp_c as c on c.id = a.id
    ) as q on ...
16
Roman Pekar

B RECHTS JOIN A ist das gleiche wie A LEFT JOIN B

B RECHTS JOIN A lautet: B ON RECHTS, DANN VERBINDET A. bedeutet, dass sich A in der linken Seite des Datensatzes befindet. genau wie A LEFT JOIN B

Wenn Sie LEFT JOINs auf RECHTS umstellen, können Sie keine Leistung erzielen.

Der einzige Grund, warum ich RIGHT JOIN verwenden kann, ist der, wenn Sie ein Typ von Person sind, der gerne von innen nach außen denkt (wählen Sie * aus der rechten Kopfzeile des Details). Es ist wie andere wie Little Endian, andere wie Big Endian, andere wie Top-Down-Design, andere wie Bottom-Up-Design.

Die andere ist, wenn Sie bereits eine riesige Abfrage haben, an der Sie eine weitere Tabelle hinzufügen möchten. Wenn Sie die Abfrage neu ordnen möchten, müssen Sie die Tabelle mit der rechten Abfrage verbinden, indem Sie die Tabelle mit RIGHT JOIN an die vorhandene Abfrage anschließen.

15
Michael Buen

Das einzige Mal, an das ich einen rechten äußeren Join denken würde, wäre, wenn ich einen vollständigen Join korrigieren würde, und es war einfach so, dass ich das Ergebnis brauchte, um alle Datensätze aus der Tabelle auf der rechten Seite zu enthalten. Selbst wenn ich so faul bin wie ich bin, würde ich mich wahrscheinlich so ärgern, dass ich ihn umstellen würde, um einen Links-Join zu verwenden.

Dieses Beispiel aus Wikipedia zeigt, was ich meine:

SELECT *  
FROM   employee 
   FULL OUTER JOIN department 
      ON employee.DepartmentID = department.DepartmentID

Wenn Sie nur das Wort FULL durch RIGHT ersetzen, haben Sie eine neue Abfrage, ohne die Reihenfolge der ON-Klausel vertauschen zu müssen.

6
Bill the Lizard
SELECT * FROM table1 [BLANK] OUTER JOIN table2 ON table1.col = table2.col

Ersetzen Sie [BLANK] durch:

LEFT - wenn alle Datensätze aus table1 erstellt werden sollen, auch wenn sie keine Spalte haben, die mit table2 übereinstimmt (auch Table2-Datensätze mit Übereinstimmungen enthalten)

RECHTS - wenn alle Datensätze aus table2 erstellt werden sollen, auch wenn sie keine Spalte haben, die mit table1 übereinstimmt (auch Table1-Datensätze mit Übereinstimmungen enthalten)

FULL - wenn Sie alle Datensätze aus Tabelle1 und Tabelle2 möchten

Worüber reden alle? Sie sind gleich? Ich glaube nicht

3

Ich musste nicht wirklich viel über die richtige Verknüpfung nachdenken, aber ich nehme an, dass ich seit fast 20 Jahren keine SQL-Abfragen geschrieben habe, auf eine solide Rechtfertigung für die Verwendung einer solchen gestoßen ist. Ich habe sicherlich viele davon gesehen, von denen ich vermute, dass sie sich daraus ergeben, wo Entwickler eingebaute Abfrage-Builder verwendet haben. 

Immer wenn ich auf eine gestoßen bin, habe ich die Abfrage umgeschrieben, um sie zu eliminieren. Ich habe festgestellt, dass sie zu viel zusätzliche mentale Energie zum Lernen oder Wiedererlernen benötigt, wenn Sie die Abfrage längere Zeit nicht besucht haben und dies nicht der Fall war. Es war ungewöhnlich, dass die Absicht der Abfrage verloren ging oder falsche Ergebnisse zurückgegeben wurde. Normalerweise führte diese Unrichtigkeit dazu, dass ich nachprüfte, warum die Abfragen nicht funktionierten. 

Wenn Sie darüber nachdenken, haben Sie, sobald Sie einen Right-Join eingeführt haben, jetzt, was ich als konkurrierende Zweige der Logik in Betracht ziehen würde, die sich in der Mitte treffen müssen. Wenn zusätzliche Anforderungen/Bedingungen eingeführt werden, werden diese beiden Zweige möglicherweise noch erweitert, und Sie haben jetzt mehr Komplexität, um zu verhindern, dass ein Zweig zu falschen Ergebnissen führt.

Sobald Sie einen Right Join einführen, können andere, weniger erfahrene Entwickler, die später an der Abfrage arbeiten, einfach zusätzliche Tabellen an den Right Join-Teil der Abfrage anheften und dabei konkurrierende Logikflüsse erweitern, die sich noch treffen müssen die Mitte; In einigen Fällen habe ich gesehen, wie man Ansichten verschachtelt, weil sie die ursprüngliche Logik vielleicht nicht berühren möchten. Dies liegt daran, dass sie möglicherweise die Abfrage oder die Geschäftsregeln nicht verstehen, die die Logik beherrschten.

2
mattpm

Ich habe nur einen Rechtsverknüpfungspunkt verwendet, als ich zwei Datensätze betrachten wollte und bereits die Verknüpfungen in einer bestimmten Reihenfolge für den Links- oder Innenverknüpfungspunkt aus einer zuvor geschriebenen Abfrage habe. Angenommen, Sie möchten die Datensätze als Datensätze anzeigen, die nicht in Tabelle a, sondern in Tabelle b und in einem anderen Satz enthalten sind, und zwar in Datensätzen, die nicht in Tabelle b, sondern in Tabelle a enthalten sind. Selbst dann neige ich dazu, dies zu tun, um Recherchen zu sparen, aber ich würde es ändern, wenn es Code wäre, der mehr als einmal ausgeführt würde.

2
HLGEM

SQL-Anweisungen sollten nicht nur korrekt sein, sondern auch so gut lesbar und ausdrucksstark wie möglich sein (da sie einzelne atomare Aktionen darstellen und Ihr Verstand sie vollständig ausschließen muss, um unbeabsichtigte Folgen zu vermeiden.) Manchmal wird ein Ausdruck deutlicher als angegeben eine rechte äußere Verbindung.

Eines kann jedoch immer in das andere umgewandelt werden, und der Optimierer wird mit dem anderen genauso gut funktionieren.

Seit einiger Zeit unterstützte mindestens eines der wichtigsten rdbms-Produkte nur LEFT OUTER JOIN. (Ich glaube es war MySQL.)

2
dkretz
SELECT * FROM table_a
INNER JOIN table_b ON ....
RIGHT JOIN table_c ON ....

Wie könnten Sie sonst die ersten beiden Tabellen schnell und einfach innerlich verknüpfen und mit table_c verbinden, während sichergestellt wird, dass alle Zeilen in table_c immer ausgewählt sind?

2
Matt

In einigen SQL-Datenbanken gibt es Optimierungshinweise, die das Optimierungsprogramm anweisen, die Tabellen in der Reihenfolge zusammenzufassen, in der sie in der FROM-Klausel erscheinen - z. /*+ORDERED */ in Oracle. In einigen einfachen Implementierungen kann dies sogar der einzige verfügbare Ausführungsplan sein.

In solchen Fällen ist die Reihenfolge der Tabellen in der FROM-Klausel von Belang, daher könnte RIGHT JOIN nützlich sein. 

1
Jiri Tousek

Ich denke, es ist schwierig, wenn Sie in diesem Fall keinen richtigen Beitritt haben. Ex mit Oracle.

with a as(
     select 1 id, 'a' name from dual union all
     select 2 id, 'b' name from dual union all
     select 3 id, 'c' name from dual union all
     select 4 id, 'd' name from dual union all
     select 5 id, 'e' name from dual union all
     select 6 id, 'f' name from dual 
), bx as(
   select 1 id, 'fa' f from dual union all
   select 3 id, 'fb' f from dual union all
   select 6 id, 'f' f from dual union all
   select 6 id, 'fc' f from dual 
)
select a.*, b.f, x.f
from a left join bx b on a.id = b.id
right join bx x on a.id = x.id
order by a.id
0
Hong Van Vit