# SQL Inner Join - On Klausel



## kossy (2. Aug 2011)

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:


```
Tabelle_1 INNER JOIN Tabelle_2
ON Tabelle_1.feld_a = Tabelle_2.feld_a
```


führt exakt zu demselben Ergebnis wie diese Anweisung:


```
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 


```
Tabelle_1 INNER JOIN Tabelle_2
ON Tabelle_1.feld_a = Tabelle_2.feld_a
```

schreibe ich stattdessen


```
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


----------



## turtle (2. Aug 2011)

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).


----------



## kossy (2. Aug 2011)

turtle hat gesagt.:


> 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).



Was genau ist das für ein Plan bzw. wie kann ich diesen nutzen oder mir ansehen?

Grüße
Kossy


----------



## Kar (2. Aug 2011)

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.


----------



## Evil-Devil (2. Aug 2011)

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.


----------



## kossy (2. Aug 2011)

Danke für die bisherigen Beiträge !!



Evil-Devil hat gesagt.:


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



Interessanter Ansatz. Welcher der SQL Statements ist denn der am häufigsten Gebräuchliste in der Datenbankpraxis?

MFG
Kossy


----------



## Kar (2. Aug 2011)

LEFT und INNER.
Wobei OUTER hin und wieder auch gebraucht wird.


----------



## kossy (3. Aug 2011)

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:


```
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


----------



## Evil-Devil (3. Aug 2011)

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.


----------



## kossy (3. Aug 2011)

Evil-Devil hat gesagt.:


> 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


----------



## Evil-Devil (3. Aug 2011)

Ich schätze schon...probiere es sonst einfach aus. Ist sicherlich auch vom verwendeten DBMS abhängig.


----------

