SQL Aus 4 Tabellen die nötigen Informationen erhalten (JOIN, UNION)

P.Slayer

Cadet 4th Year
Registriert
Dez. 2005
Beiträge
70
Also hier gehts nicht darum einfach vier Tabellen per JOIN oder UNION zu vereinen.
Ich habe folgende 4 Tabellen. Das Beispiel wird so nicht verwendet und ist rein fiktiv.

Code:
Tabelle Produkt
- produkt_id
- name
- type_id

Code:
Tabelle gekauftes_produkt
- kunden_id
- produkt_id
- anzahl

Code:
Tabelle kaufhaus_kunde
- kaufhaus_id
- kunden_id

Code:
Kunde
- kunden_id
- type_id
- produkt_id

Über den Sinn der Kundentabelle darf gestreitet werden und es ist nicht wichtig wieso die Tabelle genau diese Infos enthalten soll.

Ich habe eine kaufhaus_id vorliegen anhand dieser möchte ich nun die Zuordung Kunde - Produkt haben. Es sollen die Produkte ausgegeben werden die ein Kunde gekauft hat und auch die, die er nicht gekauft hat. Diese Produkte sollten auch noch die type_id besitzen welche beim Kunden eingetragen ist. Es soll also eine Liste von Kunden sein mit entsprechend gekauften und nicht gekauften Produkten sein. Ich hoffe das ist verständlich.

Mein Problem ist nun, dass ich bisher kein SQL-Befehl formulieren konnte, welcher mir die nötigen Infos liefert.

Am besten funktioniert folgender Befehl, welcher mir aber Produkte für einen Kunden liefert, welche eigentlich von einem anderen Kunden stammen. Da stimmen auch die kaufhaus_id nicht überein, sprich falscher Kunde, welcher in einem anderen kaufhaus das Produkt gekauft hat, da passt halt die type_id und wird dementsprechend zugeordnet.

Befehl:
Code:
SELECT * FROM Produkt a
	LEFT JOIN gekauftes_produkt pa ON a.produkt_id = pa.produkt_id
	JOIN Kunde ps ON ps.type_id = a.type_id
	JOIN kaufhaus_kunde pp ON pp.kunden_id = ps.kunden_id 
	WHERE pp.kaufhaus_id = 25

Wäre für jede Hilfe dankbar.
 
INNER JOIN, OUTER JOIN, LEFT JOIN, RIGHT JOIN und FULL JOIN.
Mach dich mal schlau...
 
Erste Antwort unbrauchbar, als ob ich das nicht schon gemacht hätte.

@floq0r deswegen habe ich auch geschrieben, dass über denn Sinn der Kundentabelle gestreitet werden darf und es nicht wichtig ist, wieso die Tabelle diese Infos hat. Das wird so nicht angewendet und es ist nur ein Beispiel, meine Tabellen haben ganz andere Informationen und es geht auch nicht um Kunden und Kaufhäuser. Ich will halt Rückschlüsse auf die DB Struktur vermeiden.
 
Was mich auch noch interessieren würde ist folgendes Verhalten.

Ich habe zwei queries.

Query 1:
Code:
SELECT * FROM kunde ps 
JOIN kaufhaus_kunde pp on pp.kunden_id = ps.kunden_id 
JOIN gekauftes_produkt pa on pa.kunden_id = ps.kunden_id 
WHERE pp.kaufhaus_id = 26
Query 2:
Code:
SELECT * FROM Produkt a JOIN (Query 1) t ON t.type_id = a.type_id

Query 1 liefert mir die richtigen Kunden, wenn ich dann aber query 2 ausführe liefert er mir Produkte von mehr Kunden als in query 1 selektiert worden sind, wie ist sowas möglich? Dann funktioniert ja query 1 unter query 2 anders.
 
Verstehe nicht ganz was hier ein alias bringen soll. Ich muss das ganze ja über type_id joinen. Ich verstehe halt nicht wieso bei query 2 plötzlich mehr Kunden auftauchen, die es in query 1 nicht gab. Sollte die Where Klausel in query 1 nicht genau sowas verhindern? Scheinbar wird eben das nicht gemacht.
Ergänzung ()

Was ich noch versuchen könnte ist ein temporary table, dann sollten da wirklich nur die richtige nergebnisse drin sein aber ob das die beste Lösung ist, ist eine andere Frage.
 
und mich wundert warum deine db-engine kein problem damit hat mehrere spalten mit der selben bezeichnung im result von query1 zurückzugeben

wenn du bei query 1 mit * alle spalten aller joined tables im result hast, woher weißt du, dass query2 "produkte" im join mit query1 über type_id nicht mit sich selbst (produkte.type_id) joined?
 
Achso :D da hast du recht, damit hat die auch ein Problem, ich habs hier nur abgekürzt mit dem Stern, sorry ...
 
Ich glaube, die Info, welche Produkte ein Kunde gekauft UND welche Produkte ein Kunde NICHT gekauft hat, bekommst du durch eine Query nicht zusammen.

Entweder du ziehst das primär über die Produkte Table auf, wie du es versucht hast, und bekommst dadurch alle Kunden, die ein Produkt gekauft haben und zusätzlich alle Produkte die evtl. von keinem Kunden gekauft wurden. Hier fehlt dir die explizite Info, welcher Kunde ein Produkt nicht gekauft hat, die Zeilen fehlen einfach.

Ziehst du den ganzen Spaß über die Kunden Tabelle auf, fehlen dir sogar noch mehr Infos.

Du kannst aber aus Ansatz 1 und einer leicht modifizierten Query, welche dir Kunden ohne Bezug zu einem Produkt liefert (Stichworte LEFT JOIN und IS NULL), ein UNION bilden, welche sämtliche Fälle abdecken sollte.
 
Zurück
Oben