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

Jake
quelle
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.

Paul Sonier
quelle
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.

mbillard
quelle
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
Paulo Scardine
quelle
1
Das ist nicht die Frage.
Jonathan Hartley
5

Eine ziemlich gute Anleitung für Joins finden Sie hier: http://en.wikipedia.org/wiki/Join_(SQL)

Und ja, beide Aussagen sind gleichwertig :-)

Gabriel Magana
quelle
1
@ Djacobson: Danke, korrigiert. Nichts ist so einfach, dass es nicht vermasselt werden kann!
Gabriel Magana
2
Es war ein Slogan, den ich in den alten BBS-Tagen verwendet habe ... Ah, die Erinnerungen an USR-Luxus um 14.4k :)
Gabriel Magana
1
Erinnert an: Legastheniker der Welt ... UNTIE! :)
Dan J
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.

Dan J.
quelle
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