Unterschied zwischen linkem und rechtem Join in SQL Server


225

Ich kenne Joins in SQL Server.

Beispielsweise. Es gibt zwei Tabellen Tabelle1, Tabelle2.

Ihre Tabellenstrukturen sind die folgenden.

create table Table1 (id int, Name varchar (10))

create table Table2 (id int, Name varchar (10))

Tabelle 1 Daten wie folgt:

    Id     Name     
    -------------
    1      A        
    2      B    

Tabelle 2 Daten wie folgt:

    Id     Name     
    -------------
    1      A        
    2      B 
    3      C

Wenn ich beide unten genannten SQL-Anweisungen ausführe, sind beide Ausgaben gleich

select *
from Table1
  left join Table2 on Table1.id = Table2.id

select *
from Table2
  right join Table1 on Table1.id = Table2.id

Bitte erläutern Sie den Unterschied zwischen linkem und rechtem Join in den obigen SQL-Anweisungen.

Antworten:


73
Select * from Table1 left join Table2 ...

und

Select * from Table2 right join Table1 ...

sind in der Tat völlig austauschbar. Versuchen Sie jedoch Table2 left join Table1(oder das identische Paar Table1 right join Table2), einen Unterschied festzustellen. Diese Abfrage sollte Ihnen mehr Zeilen geben, da Tabelle2 eine Zeile mit einer ID enthält, die in Tabelle1 nicht vorhanden ist.


17
Warum brauchen wir also, RIGHT JOINwenn wir mit nur ein gewünschtes Ergebnis erzielen können LEFT JOIN? : P
user1857492

1
@ SilapAliyev Das ist eigentlich eine sehr gute Frage. Kann jemand antworten? : D
Ian Chu Te

21
Select * from Table1 left join Table 2gibt ALLE Datensätze von Tabelle 1 plus übereinstimmende Datensätze von Tabelle 2 zurück. Das Gegenteil Select * from Table1 right join Table 2würde ALLE Datensätze aus Tabelle 2 und übereinstimmende Datensätze von Tabelle 1 zurückgeben. Hoffentlich hilft es.
Programador Adagal

3
Wenn Sie mehr als 2 Tabellen verwenden, kann die Verwendung der richtigen Verknüpfung sinnvoll und lesbar sein
ɐɯıɥʇɹɐʞ ouɐɯ

1
@ MarkusMeskanen Sie ändern einen einfachen Satz von 7 Wörtern. Wenn Sie einen Satz mit 356 Zeilen mit mehreren Sätzen haben und die Logik von Links Rechts ändern müssen, werden Sie sich fragen, ob Sie ihn nur mit einem Wort ändern können ...
Programador Adagal

1014

Codeproject enthält dieses Bild, in dem die einfachen Grundlagen von SQL-Joins erläutert werden: http://www.codeproject.com/KB/database/Visual_SQL_Joins.aspx SQL-Joins erklärt


64
Da drin sind nicht viele Details. Das Guthaben sollte eigentlich auf die Codeprojektseite anstatt auf mich gehen. Aber die Aufmerksamkeit
Daan Timmer

6
@Daan Timmer nein, du musst auch Kredit haben! Sie verpacken neu und verkaufen weiter, um eine bestimmte und spezielle Anforderung zu erfüllen. Einzelhändler tun dasselbe und erhalten Milliarden
Dollar

Ich bin der Meinung, dass wir möglicherweise eine "UND" -Zustand benötigen, in der die letzte Ziffer der "Äußeren ohne JOIN" enthalten ist. Ich fühle mich Abfrage Bedarf aktualisiert werden , um <select_list> FROM Table_A A FULL OUTER JOIN Table_B B ON A.Key = B.Key WHERE A.Key ist null und B.Key IS NULL
vinsinraw

@vinsinraw das wird nicht benötigt. Denn das ist schon durch die Bedingung abgedeckt : JOIN Table_B b ON A.Key = B.Key. Die OP-Bedingung funktioniert einwandfrei.
Daan Timmer

Dies ist ein häufiger Missbrauch von Venn-Diagrammen. Die Kreise A & B stellen keine Tabellen A & B dar, Kreis A ist A LEFT JOIN B & Cirlce B ist A RIGHT JOIN B. Auch spielt es keine Rolle, wie die ON-Bedingung ist & Tasten sind irrelevant & WHEREs funktionieren nicht alle Fall. Siehe meine Kommentare und Antworten auf dieser Seite und in diesem Abschnitt zu Venn-Diagrammen .
philipxy

37

Die Tabelle, aus der Sie Daten entnehmen, ist 'LINKS'.
Die Tabelle, der Sie beitreten, ist "RECHTS".
LINKS VERBINDEN: Nehmen Sie alle Elemente aus der linken Tabelle UND (nur) übereinstimmende Elemente aus der rechten Tabelle.
RECHTS BEITRETEN: Nehmen Sie alle Gegenstände vom rechten Tisch UND (nur) passende Gegenstände vom linken Tisch.
So:

Select * from Table1 left join Table2 on Table1.id = Table2.id  

gibt:

Id     Name       
-------------  
1      A          
2      B      

aber:

Select * from Table1 right join Table2 on Table1.id = Table2.id

gibt:

Id     Name       
-------------  
1      A          
2      B   
3      C  

Sie haben die Tabelle rechts mit weniger Zeilen in der Tabelle mit mehr Zeilen verbunden
UND
wieder die Tabelle links mit weniger Zeilen in der Tabelle mit mehr Zeilen verbunden.
Versuchen Sie:

 If Table1.Rows.Count > Table2.Rows.Count Then  
    ' Left Join  
 Else  
    ' Right Join  
 End If  

21

(INNER) JOIN: Gibt Datensätze zurück, deren Tabellen in beiden Tabellen übereinstimmen.

LEFT (OUTER) JOIN: Gibt alle Datensätze aus der linken Tabelle und die übereinstimmenden Datensätze aus der rechten Tabelle zurück.

RIGHT (OUTER) JOIN: Gibt alle Datensätze aus der rechten Tabelle und die übereinstimmenden Datensätze aus der linken Tabelle zurück.

FULL (OUTER) JOIN: Gibt alle Datensätze zurück, wenn eine Übereinstimmung in der linken oder rechten Tabelle vorliegt

Nehmen wir zum Beispiel an, wir haben zwei Tabellen mit folgenden Datensätzen:

Tabelle A.

id   firstname   lastname
___________________________
1     Ram         Thapa
2     sam         Koirala
3     abc         xyz
6    sruthy       abc

Tabelle B.

id2   place
_____________
1      Nepal
2      USA
3      Lumbini
5      Kathmandu

Inner Join

Hinweis: Es gibt den Schnittpunkt zweier Tabellen.

Inner Join

Syntax

SELECT column_name FROM table1 INNER JOIN table2 ON table1.column_name = table2.column_name;

Wenden Sie es in Ihrer Beispieltabelle an:

SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA INNER JOIN TableB ON TableA.id = TableB.id2;

Ergebnis wird sein:

firstName       lastName       Place
_____________________________________
  Ram         Thapa             Nepal
  sam         Koirala            USA
  abc         xyz              Lumbini

Links beitreten

Hinweis: Gibt alle ausgewählten Zeilen in Tabelle A sowie alle gemeinsam ausgewählten Zeilen in Tabelle B an.

Links verbinden

SELECT column_name(s) FROM table1 LEFT JOIN table2 ON table1.column_name = table2.column_name;

Wenden Sie es in Ihrer Beispieltabelle an

SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA LEFT JOIN TableB ON TableA.id = TableB.id2;

Ergebnis wird sein:

firstName   lastName    Place
______________________________
 Ram         Thapa      Nepal
 sam         Koirala    USA
 abc         xyz        Lumbini
sruthy       abc        Null

Right Join

Hinweis: Gibt alle ausgewählten Zeilen in Tabelle B sowie alle gemeinsam ausgewählten Zeilen in Tabelle A an.

Right Join

Syntax:

SELECT column_name(s) FROM table1 RIGHT JOIN table2 ON table1.column_name = table2.column_name;

Wende es in deiner Samoletabelle an:

SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA RIGHT JOIN TableB ON TableA.id = TableB.id2;

Ergebnis wird bw:

firstName   lastName     Place
______________________________
Ram         Thapa         Nepal
sam         Koirala       USA
abc         xyz           Lumbini
Null        Null          Kathmandu

Vollständige Teilnahme

Hinweis: Dies entspricht der Vereinigungsoperation und gibt alle ausgewählten Werte aus beiden Tabellen zurück.

Vollständiger Join

Syntax:

SELECT column_name(s) FROM table1 FULL OUTER JOIN table2 ON table1.column_name = table2.column_name;

Wenden Sie es in Ihrem Samp an [le table:

SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA FULL JOIN TableB ON TableA.id = TableB.id2;

Ergebnis wird sein:

firstName   lastName    Place
______________________________
 Ram         Thapa      Nepal
 sam         Koirala    USA
 abc         xyz        Lumbini
sruthy       abc        Null
 Null         Null      Kathmandu

Einige Fakten

Für INNER-Joins spielt die Reihenfolge keine Rolle

Bei (LEFT, RIGHT oder FULL) OUTER-Joins spielt die Reihenfolge eine Rolle

Weitere Informationen finden Sie unter w3schools


12
select fields 
from tableA --left
left join tableB --right
on tableA.key = tableB.key

Die Tabelle in fromdiesem Beispiel tableAbefindet sich auf der linken Seite der Beziehung.

tableA <- tableB
[left]------[right]

Wenn Sie also alle Zeilen aus der linken Tabelle ( tableA) übernehmen möchten , auch wenn die rechte Tabelle ( tableB) keine Übereinstimmungen enthält , verwenden Sie den "linken Join".

Und wenn Sie alle Zeilen aus der rechten Tabelle ( tableB) übernehmen möchten , auch wenn die linke Tabelle ( tableA) keine Übereinstimmungen enthält , verwenden Sie dieright join .

Daher entspricht die folgende Abfrage der oben verwendeten.

select fields
from tableB 
right join tableA on tableB.key = tableA.key

10

Sie scheinen zu fragen : „Wenn ich ein umschreiben kann RIGHT OUTER JOINmit LEFT OUTER JOINdann Syntax , warum eine habe RIGHT OUTER JOINüberhaupt Syntax?“ Ich denke, die Antwort auf diese Frage lautet, weil die Designer der Sprache den Benutzern keine solche Einschränkung auferlegen wollten (und ich denke, sie wären kritisiert worden, wenn sie dies getan hätten), was die Benutzer dazu zwingen würde, die Reihenfolge der Tabellen zu ändern in der FROMKlausel unter bestimmten Umständen, wenn lediglich der Join-Typ geändert wird.


manchmal sind linke und rechte äußere Verbindungen vollständig austauschbar, richtig?
ス レ ッ ク ス

4
@Alex: In der Tat sind linke und rechte äußere Verknüpfungen immer austauschbar.
Tag, wenn

8

Ihre beiden Aussagen sind gleichwertig.

Die meisten Leute verwenden nur, LEFT JOINweil es intuitiver erscheint und es eine universelle Syntax ist - ich denke nicht, dass alle RDBMS unterstützt werden RIGHT JOIN.


"Ich denke nicht, dass alle RDBMS RIGHT JOIN unterstützen" - sicher, nicht alle RDBMS unterstützen SQL. Wenn Sie jedoch implizieren, dass einige SQL-Produkte dies unterstützen, LEFTaber nicht RIGHT, geben Sie bitte an, welche.
Tag, wenn

10
@onedaywhen Zum Beispiel implementiert SQLite 3 nicht RIGHTund FULL OUTER JOIN : sqlite.org/omitted.html
Mac_Cain13

0

Ich bin der Meinung, dass wir möglicherweise eine ANDBedingung in whereKlausel der letzten Zahl von benötigen , Outer Excluding JOINdamit wir das gewünschte Ergebnis von erhalten A Union B Minus A Interaction B. Ich bin der Meinung, dass die Abfrage aktualisiert werden muss

SELECT <select_list>
FROM Table_A A
FULL OUTER JOIN Table_B B
ON A.Key = B.Key
WHERE A.Key IS NULL AND B.Key IS NULL

Wenn wir verwenden OR, erhalten wir alle Ergebnisse vonA Union B


0

Wählen Sie * aus Tabelle1 und verbinden Sie Tabelle2 mit Tabelle1.id = Tabelle2.id

In der ersten Abfrage LEFT JOIN vergleicht linksseitigen Tabelle table1 zu rechtsseitigen Tabelle table2 .

In dem werden alle Eigenschaften von Tabelle1 angezeigt, während in Tabelle2 nur die Eigenschaften angezeigt werden, in denen die Bedingung erfüllt ist.

Wählen Sie * aus Tabelle2 aus und verbinden Sie Tabelle1 mit Table1.id = Table2.id

In der ersten Abfrage vergleicht Right Join die rechtsseitige Tabelle table1 mit der linksseitigen Tabelle table2 .

In dem werden alle Eigenschaften von Tabelle1 angezeigt, während in Tabelle2 nur die Eigenschaften angezeigt werden, in denen die Bedingung erfüllt ist.

Beiden Abfragen werden das gleiche Ergebnis , da die Reihenfolge der Tabellendeklaration in Abfrage unterschiedlich ist wie erklären Sie Tabelle1 und Tabelle2 in links und rechts jeweils in ersten LEFT JOIN Abfrage, und auch erklärt tabelle1 und table2 in rechts und links jeweils in der zweiten Straße rechts beitreten Abfrage.

Dies ist der Grund, warum Sie in beiden Abfragen das gleiche Ergebnis erhalten. Wenn Sie also ein anderes Ergebnis wünschen, führen Sie diese beiden Abfragen aus.

Wählen Sie * aus Tabelle1 und verbinden Sie Tabelle2 mit Tabelle1.id = Tabelle2.id

Wählen Sie * aus Tabelle1 aus und verbinden Sie Tabelle2 mit Table1.id = Table2.id


0

Select * from Table1 t1 Left Join Table2 t2 on t1.id=t2.id Per Definition: Left Join wählt alle Spalten aus, die mit dem Schlüsselwort "select" aus Tabelle 1 und den Spalten aus Tabelle 2 erwähnt wurden, die den Kriterien nach dem Schlüsselwort "on" entsprechen.

In ähnlicher Weise wählt Per Definition: Right Join alle Spalten aus, die mit dem Schlüsselwort "select" aus Tabelle 2 und den Spalten aus Tabelle 1 erwähnt wurden, die den Kriterien nach dem Schlüsselwort "on" entsprechen.

In Bezug auf Ihre Frage werden die IDs in beiden Tabellen mit allen Spalten verglichen, die für die Ausgabe benötigt werden. Daher sind die IDs 1 und 2 in beiden Tabellen gleich. Als Ergebnis haben Sie vier Spalten mit ID- und Namensspalten aus der ersten und zweiten Tabelle in der angegebenen Reihenfolge.

*select * from Table1 left join Table2 on Table1.id = Table2.id

Mit dem obigen Ausdruck werden alle Datensätze (Zeilen) aus Tabelle 1 und Spalten mit übereinstimmenden IDs aus Tabelle 1 und Tabelle 2 aus Tabelle 2 übernommen.

select * from Table2 right join Table1 on Table1.id = Table2.id**

In ähnlicher Weise werden aus dem obigen Ausdruck alle Datensätze (Zeilen) aus Tabelle 1 und Spalten mit übereinstimmenden IDs aus Tabelle 1 und Tabelle 2 aus Tabelle 2 übernommen. (Denken Sie daran, dies ist eine richtige Verknüpfung, sodass alle Spalten aus Tabelle 2 und nicht aus Tabelle1 wird berücksichtigt).

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.