SQL Inner Join - On Klausel

kossy

Bekanntes Mitglied
Hallo zusammen !

Ich würde gerne mal etwas von euch wissen wollen. Wenn ich einen Inner Join über zwei oder evtl. auch mehrere Tabellen vornehme, dann baue ich ja den Inner Join über die sogenannte ON Klausel auf.

Ich habe bisher durch die eigene Praxis festgestellt, dass es egal ist, auf welcher Seite ich vom Schlüsselwort Inner Join welche Tabelle schreibe, es wird semantisch immer das gleiche Ergebnis produziert.

Ein Beispiel:

Diese Anweisung:

SQL:
Tabelle_1 INNER JOIN Tabelle_2
ON Tabelle_1.feld_a = Tabelle_2.feld_a


führt exakt zu demselben Ergebnis wie diese Anweisung:

SQL:
Tabelle_2 INNER JOIN Tabelle_1
ON Tabelle_1.feld_a = Tabelle_2.feld_a

Nun stellt sich für mich die Frage, ob es die Semantik der Ergebnismenge signifikant verändert, wenn ich nicht die Tabellenamen innerhlab der INNER JOIN Klausel austausche, sondern nur die Fremd- und Primärschlüsselfelder innerhalb der ON Klausel?


Nochmal ein Beispiel:

Anstatt

SQL:
Tabelle_1 INNER JOIN Tabelle_2
ON Tabelle_1.feld_a = Tabelle_2.feld_a

schreibe ich stattdessen

SQL:
Tabelle_1 INNER JOIN Tabelle_2
ON Tabelle_2.feld_a = Tabelle_1.feld_a


und baue die Join Bedingung um, indem ich nur die Bedingungen in der ON Klausel vertausche.

Ich hatte das mal selbst ausgetestet und habe keine Veränderungen festgestellt. Ich stelle diese Frage jetzt hier im Forum, weil ich zu dieser speziellen Frage in keiner Literatur und auch nirgens im Internet eine ganz genaue und detailierte Antwort zu dieser Frage finden konnte. Insbesondere ist diese Frage interessant, wenn ein INNER JOIN auf diese Weise über mehrere Tabellen aufgebaut wird und ab und an mal die ON Klausel unterschiedlich aufgebaut werden.

Bitte keine Hinweise und Links zu Seite, wo die einfache Syntax des INNER JOINS erläutert wird. Da habe ich bereits etliche durch, es geht einzig und alleine um das Vertauschen der ON Klausel.

Viele Grüße
Kossy
 
Zuletzt bearbeitet von einem Moderator:
Ob das einen Unterschied macht, lässt sich nur über den SQL-Plan erfahren, den die DB für die Ausführung gewählt hat (explain).
 
Die Grundlage des INNER JOINs ist das Kartesische Produkt. Ob du jetzt Feld A aus Tabelle1 mit Feld A aus Tabelle2 vergleichst oder umgekehrt ist das Gleiche.
 
Bei einem INNER JOIN ist die Reihenfolge egal. Erst wenn du mit LEFT bzw. RIGHT OUTER JOIN arbeitest ist die Reihenfolge der Verknüpfung entscheidend.

Hierzu würde ich dir empfehlen entweder in der MySQL Doku zu schauen oder einfach in einem der vielen Tutorials die man via Google zu dem Thema finden kann. 🙂

Wobei man Left/Right Outer Join eher selten benötigt.
 
Hallo !

Ich habe nochmal eine andere Frage an euch. Wenn ich mithilfe der ON-Klausel einen beliebigen JOIN in meiner Datenbank produziere, habe ich dann eigentlich die Möglichkeit zwei Tabellen nach unterschiedlichen Kriterien zu "joinen", oder funktioniert das nur anhand eines Kriteriums?

Dazu vielleicht mal ein Beispiel, um zu verstehen, worauf ich eigentlich hinaus möchte:

SQL:
SELECT *
FROM Tabelle_1 tbl1 INNER JOIN Tabelle_2 tbl2
ON tbl1.feld_1 = tbl2.feld_2
    AND tbl1.feld_x <> tbl2.feld_y
    AND tbl1.feld_abc < tbl2.feld_abc

Gibt es evtl. auch di Möglichkeit, die Bedingungen in einer ON Klausel noch mehr zu verkomplizieren, indem man evtl. die Felder der Tabellen (z.B. tbl1.feld_x) mithilfe eines Selects zu ermitteln?

Ich habe dazu mal in Netz nach Beispiel gesucht, bin aber nirgends wirklich entsprechen fündig geworden mit Beispielen, die genau auf meine Frage abzielen.

MFG
Kossy
 
Wenn du Tabellen joinst, dann willst du in der Regel Daten ziehen die zusammen hängen. Also über eine ID, einen Text oder wie auch immer die zu verbinden sind. Auf Kleiner oder ungleich mach imho wenig Sinn. Weil du dann n:m Mengen erhalten würdest die ganz sicher nicht dein Ziel sind.

Für den Fall das du die Ergebnismengen einschränken willst oder nur bestimmte Mengen haben willst könntest du mit temporären Tabellen im From arbeiten bzw. über die where Klausel die Menge eingrenzen.
 
Wenn du Tabellen joinst, dann willst du in der Regel Daten ziehen die zusammen hängen. Also über eine ID, einen Text oder wie auch immer die zu verbinden sind. Auf Kleiner oder ungleich mach imho wenig Sinn. Weil du dann n:m Mengen erhalten würdest die ganz sicher nicht dein Ziel sind.

Für den Fall das du die Ergebnismengen einschränken willst oder nur bestimmte Mengen haben willst könntest du mit temporären Tabellen im From arbeiten bzw. über die where Klausel die Menge eingrenzen.

Ok danke schön für das Feedback !!

Aber grundsätzlich wäre es theoretisch möglich, die On Klausel auch so zu nutzen wie ich es im Beispiel beschrieben habe oder (egal, ob das nun einen semantischen Sinn ergibt oder nicht)?

Viele Grüße
Kossy
 

Neue Themen


Zurück
Oben