Welche Tabelle ist genau die "linke" Tabelle und die "rechte" Tabelle in einer JOIN-Anweisung (SQL)?


70

Was macht eine bestimmte Tabelle zur linken Tabelle?

Ist es so, dass die Tabelle im Teil "Von" der Abfrage angegeben ist?

Oder ist es die linke Tabelle, weil sie sich auf der linken Seite des Operators = befindet?

Sind die folgenden äquivalent

SELECT *
FROM left_table
LEFT JOIN right_table ON left_table.right_id = right_table.id

und

SELECT *
FROM left_table
LEFT JOIN right_table on right_table.left_id = left_table.id

???

Vielen Dank


Ihre zweite Abfrage scheint verwirrend zu sein, warum nicht schreiben: SELECT * FROM left_table LEFT JOIN right_table auf right_table.id = left_table.right_id
levolutionniste

Antworten:


52

Die linke Tabelle ist die erste Tabelle in der Auswahl. Ja, Ihre beiden Beispiele sind gleichwertig.


2
Dies bedarf der Klärung. Was meinst du mit "der ersten Tabelle in der Auswahl"?
Fraxture

14

Der richtige Tisch ist immer der Tisch, an dem Sie teilnehmen. Also ja, beide Aussagen sind gleichwertig.

JOIN [Table] ON ...

[Tabelle] ist immer die richtige Tabelle.


3
Dies wirft die Frage auf, was "der Tisch, an dem Sie teilnehmen" bedeutet.
Philipxy

11

Ungefähr "links" ist das Ergebnis von allem, was beim Lesen von links nach rechts zuerst in der gesamten FROM-Klausel erscheint - einschließlich des Ergebnisses anderer JOINs, Unterabfragen, VIEWs und STORED PROCEDURES.

Beide SQL-Anweisungen sind äquivalent, da der =Operator im ONTeil der JOINKlausel symmetrisch ist (wenn a = b, dann b = a), sodass das Ergebnis unabhängig von der Reihenfolge dasselbe ist.

Der reguläre Join zeigt nur die Zeilen an, in denen die ON-Klausel des JOIN wahr ist, während der LEFT JOIN auch die Datensätze von "left" anzeigt, wenn die Bedingung falsch ist (wobei NULL für jede Spalte von "right" in SELECT angezeigt wird).

Zum Beispiel:

-- People:           -- Car
id | name            owner_id | model
---+------------     ---------+------------
1  | Paul            1        | Ferrari
2  | Nancy           2        | Porsche
3  | Arthur          NULL     | Lamborghini
4  | Alfred          10       | Maserati

> select people.name, car.model from people join car on car.owner_id=people.id;

name     | model
---------+--------------
Paul     | Ferrari
Nancy    | Porsche
2 record(s) found

> select people.name, car.model from people left join car on 
  car.owner_id=people.id;

name     | model
---------+--------------
Paul     | Ferrari
Nancy    | Porsche
Arthur   | NULL
Alfred   | NULL     
4 record(s) found

> select people.name, car.model from people left join car on 
  people.id = car.owner_id;

name     | model
---------+--------------
Paul     | Ferrari
Nancy    | Porsche
Arthur   | NULL
Alfred   | NULL     
4 record(s) found

1
Das ist nicht die Frage.
Jonathan Hartley


3

Ja, dies wird von der Seite des JOIN-Operators bestimmt, auf dem die Tabelle angezeigt wird. Ihre beiden Beispiele sind in der Tat gleichwertig.


Ihre Antwort scheint sich zu widersprechen. Sie sagen, die Position relativ zum Operator bestimmt, welche Tabelle links und rechts ist, aber in meinem Beispiel werden sie vertauscht, und Sie sagen, sie sind gleichwertig.
Jake

Lesen Sie bitte sorgfältig durch: Ich sagte die Position relativ zum JOIN- Operator, nicht zum Gleichheitsoperator.
Dan J
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.