# Join 3 Tabellen - SQL



## hadda4new (11. März 2013)

Hallo,

folgende Tabellen sind vorhanden:

Tabelle 1 - Ware:
- Ware_ID
- Bezeichnung
- ...

Tabelle 2 - Ware_Bestand:
- ID
- Ware_ID
- Bestand_ID

Tabelle 3 - Bestand:
- Bestand_ID
- Menge
- Lagerort
- ... 


Zu den Problemen/Fragen:
Leider kann ich sie diese Woche nicht ausprobieren, deswegen bitte ich um Hilfe und evtl. Berichtigung!

1.) Ich möchte nun alle Waren, die sich im Lagerort "xyz" befinden!

SELECT * FROM Ware w 
   INNER JOIN Ware_Bestand wb
   ON w.Ware_ID = wb.Ware_ID
   INNER JOIN Bestand b
   ON wb.Bestand_ID = b.Bestand_ID
      WHERE b.Lagerort='xyz';

oder ist das ganz falsch - Ich hab bis jetzt nur mit joins über zwei tabellen gearbeitet?


Für 2.) benötige ich erstmal eine Richtige Lösung für 1.)

2.) Alle Waren mit der Anzahl der Lagerorte


Vielen Dank!

bis jetzt hab ich das (müsste auch stimmen:

1.)
SELECT * FROM ware w 
INNER JOIN ware_bestand wb
ON w.W_ID = wb.W_ID
INNER JOIN bestand b
ON ws.BESTAND_ID = b.BESTAND_ID
WHERE b.Lagerort LIKE '%xyz%';

nur 2. bereitet mir Sorgen ich hab das hier:

SELECT w.W_ID,count(b.Lagerort) FROM kunde k
INNER JOIN ware_bestand wb
ON w.W_ID = wb.W_ID
INNER JOIN bestand b
ON ws.BESTAND_ID = b.BESTAND_ID;

 bekomm dadurch allerdings nur die ausgabe der ersten waren und bei count hab ich die anzahl der kompletten reihen der spalte Bestand!?


----------



## Yaslaw (11. März 2013)

Also, das 1) hast du ganz richtig

Also an die 2)
Du hast es fast richtig. Um die ANzahl verschiedene Lagerorte zu ermitteln braucht man den COUNT(DISTINCT ...)


```
SELECT 
	w.W_ID,
	COUNT(DISTINCT b.Lagerort) 
FROM 
	kunde k
	INNER JOIN ware_bestand wb
		ON w.W_ID = wb.W_ID
	INNER JOIN bestand b
		ON ws.BESTAND_ID = b.BESTAND_ID;
```


----------



## hadda4new (12. März 2013)

Ganz stimmt es allerdings noch nicht.
Korrekterweise stimmt nun die Anzahl allerdings erhalte ich wie vorher lediglich die erste Warenid - ware 2 und 3 die sich ebenfalls in der DB befinden und auch bei 1.) angezeigt werden, werden hier nicht aufgelistet!

Woran könnte das liegen?

Schonmal Danke!

[UPDATE]
Wenn ich eine where Bedingung einbaue und testweise nach der Warenid 2 abfrage, so erhalte ich auch hier die richtige Anzahl.
Warum ohne where-Bedingung lediglich die erste Ware angezeigt wird, verstehe ich überhaupt nicht!


----------



## Yaslaw (12. März 2013)

Haben die Warenid 2 und 3 auch Einträge in wb und entsprechende Einträge in b?

Ansonsten kanns nicht sein, da der einzige Filter der INNER JOIN ist


----------



## hadda4new (12. März 2013)

Normalerweise schon, sonst würde ich doch bei 1. keine Waren für Warenid 2 bekommen, oder?

Und wie im post zuvor beschrieben, erhalte ich beim einfügen einer where bedingung auf ware 2 eine korrekte lösung.


----------



## Yaslaw (12. März 2013)

Hast du Testdaten?
Dann mach mal je ien Table-Dump und stelle uns deine Testdaten zur Verfügung.
Rein nach SQL ist es so richtig - ergo muss ich mir die Daten genauer aunschauen


----------

