# reihenfolge der operanden bei join's



## ruutaiokwu (18. Jul 2014)

hallo zusammen

jemand hat mir gesagt, dass es bei sql-join's relevant ist wie die reihenfolge der "operanden" beim vergleichsoperator definiert werden. als test-db habe ich die "credit"-db von sql server genommen:


```
SELECT
  *
FROM member mbr

LEFT JOIN payment pmt
ON ([B][COLOR="Red"]pmt.member_no = mbr.member_no[/COLOR][/B])
```

sowie


```
SELECT
  *
FROM member mbr

LEFT JOIN payment pmt
ON ([B][COLOR="Red"]mbr.member_no = pmt.member_no[/COLOR][/B])
```


...wie ich aber sehe kommt immer das gleiche dabei raus.

ein anderes beispiel: es gibt a.) eine kundentabelle (adressdaten etc.) sowie b.) eine bestellungstabelle.

nun möchte man allen kunden mit allen bestellungen (wenn vorhanden! daher "left join") ausgeben:

(pseudo-code)

```
SELECT * FROM kunden LEFT JOIN bestellungen ON (kunden.ID = bestellungen.ID)
```



im anderen fall möchte man alle bestellungen wenn möglich zusätzlich mit kunden ausgeben, jedoch auch wenn der kunden in der zwischenzeit gelöscht wurde (foreign key -> "SET NULL" beim löschen des PK's in der kundentabelle!)

(pseudo-code)

```
SELECT * FROM bestellungen LEFT JOIN kunden ON (kunden.ID = bestellungen.ID)
```



...das ist doch die einzige art und weise wie man das "gegenteil" erreichen kann, oder macht man das wirklich mit der umkehrung der operanden??? leider fehlt mit z.zt. die möglichkeit das praktisch zu testen.

und: bei einem "OUTER JOIN" ist es irrelevant welche tabelle beim "SELECT" und welche beim "JOIN" angegeben wird, wahrscheinlich auch beim "OUTER JOIN"...? sehe ich das richtig?


vielen dank für eure feedbacks.


----------



## Times (18. Jul 2014)

Wenn ich dich richtig verstehe suchst du einfach den RIGHT JOIN oder?

Hier mal ein paar Beispiele:

1. LEFT JOIN
Selektiert alle Kunden mit dazugehöriger Bestellung, auch die Kunden ohne Bestellung

```
SELECT Kunde.*,Bestellung.* FROM Kunde LEFT JOIN Bestellung ON Kunde.BestellungID = Bestellung.ID
```

2. RIGHT JOIN
Selektiert nur Kunden mit dazugehöriger Bestellung, auch Bestellungen ohne Kunden. (Bissel verwirrend, kanns nicht anders erklären^^)

```
SELECT Kunde.*,Bestellung.* FROM Kunde RIGHTJOIN Bestellung ON Kunde.BestellungID = Bestellung.ID
```

3. INNER JOIN
Selektiert nur Kunden welche auch Bestellung haben

```
SELECT Kunde.*,Bestellung.* FROM Kunde INNER JOIN Bestellung ON Kunde.BestellungID = Bestellung.ID
```

4. OUTER JOIN
Kenn ich garnicht.. sry


----------



## ruutaiokwu (18. Jul 2014)

hallo Times

vielen dank für dein feedback.

das mit dem join's war "einigermassen" klar. (gemäss code-konvention dürfen wir in der firma keine right-joins verwenden, sondern müssen das statement unkehren... na ja, eigentlich mag ich codekonventionen gar nicht!! :noe

die primäre frage war diese:



> "jemand hat mir gesagt, dass es bei sql-join's relevant ist wie die reihenfolge der "operanden" beim vergleichsoperator definiert werden. als test-db habe ich die "credit"-db von sql server genommen:"



*SELECT * FROM member mbr LEFT JOIN payment pmt ON (pmt.member_no = mbr.member_no)*

müsste folgedessen was anderes machen als

*SELECT * FROM member mbr LEFT JOIN payment pmt ON (mbr.member_no = pmt.member_no)*


ich kann mir aber kaum vorstellen dass das stimmt... jemand behauptet das in unserer firma stur bei left- (und auch right-) joins mache dies einen unterschied...?


p.s.: outer join habe ich in meinem ganzen leben auch noch nie gebraucht. wohl "alles was nicht gemeinsam ist" oder so ;-)


----------



## ruutaiokwu (18. Jul 2014)

was schreibe ich für schräges zeug wenn ich im stress bin? ;-)
->


> "und: bei einem "OUTER JOIN" ist es irrelevant welche tabelle beim "SELECT" und welche beim "JOIN" angegeben wird, wahrscheinlich auch beim "OUTER JOIN"...? sehe ich das richtig?"




sollte heissen:

und: bei einem *"INNER JOIN"* ist es irrelevant welche tabelle beim "SELECT" und welche beim "JOIN" angegeben wird, wahrscheinlich auch beim "OUTER JOIN"...? sehe ich das richtig?


ein schönes wochenende!


----------



## ceving (20. Jul 2014)

jmar83 hat gesagt.:


> die primäre frage war diese:
> 
> *SELECT * FROM member mbr LEFT JOIN payment pmt ON (pmt.member_no = mbr.member_no)*
> 
> ...



Alles richtig. Die Reihenfolge in der Condition ist egal. Gleich ist Gleich. Gleichung halt.

Entscheidend ist das die Reihenfolge beim Join.


```
member left join payment
```
 liefert alle aus member mit nulls in payment, wenn in payment keiner ist, für den die Condition zutrifft.

Und 
	
	
	
	





```
payment left join member
```
 liefert alle aus payment mit nulls in member.

Letzteres ist der Right-Join von ersterem.


----------



## ruutaiokwu (21. Jul 2014)

coole sache, vielen dank für die klarstellung!!


----------

