Abfrage mit JOIN über 4 Tabellen

newbie

Benutzer
Beiträge
7
Entschuldigt, mit Sicherheit ist eine ähnliche Abfrage schon mehrfach hier besprochen worden.
Allerdings habe ich nichts passendes gefunden.

Angenommen ich habe 4 Tabellen:

Autos (Alle Autos, die ein Autohaus verkauft)
Angebot (bestimmtes Angebot für ein Auto) -> beinhaltet den PK von Autos als FK
Auswahl (Beziehungstabelle zw. Kunde und Angebot) -> beinhaltet die PKs von Autos und Kunden
Kunden (Alle Kunden des Autohauses)

D.h.
- ein Auto kann mehrfach angeboten werden, aber ein Angebot enthält immer nur ein Auto
- ein Kunde kann mehrere Angebote bekommen und ein Angebot kann an mehrere Kunden gehen.
(Ist daher natürlich kein richtiges Angebot mit fest zugeordneter Angebotsnummer)

Wie bekomme ich nun eine Liste, die besagt, welcher Kunde zu welchem Auto ein Angebot bekommen hat?

Vielen Dank schon mal vorab!
 
Werbung:
Hallo akretschmer,
danke für die schnelle Rückmeldung.

wie immer, wenn ich mich mit so etwas befassen muss, laufe ich erstmal in den Fehler es ohne JOINS zu versuchen

Das wirft mir natürlich nur ein reduziertes kathesisches Prokukt aus.

Wenn ich also davon ausgehe, dass ich evtl. nach einem bestimmten Kunden filtern möchte, und meine Kunden-Tabelle die linke ist, würde ich einen RIGHT JOIN bauen. Allerdings scheitere ich völligst an der Verschachtelung.
Oder ist mein Ansatz schon grundlegend falsch?
 
vermutlich hast /willst Du in etwas sowas:

Code:
test=*# \d autos;
  Table "public.autos"
 Column |  Type  | Modifiers
--------+---------+-----------
 id  | integer | not null
 name  | text  |
Indexes:
  "autos_pkey" PRIMARY KEY, btree (id)
Referenced by:
  TABLE "angebot" CONSTRAINT "angebot_auto_fkey" FOREIGN KEY (auto) REFERENCES autos(id)

test=*# \d angebot
  Table "public.angebot"
 Column |  Type  | Modifiers
--------+---------+-----------
 id  | integer | not null
 auto  | integer |
 preis  | integer |
Indexes:
  "angebot_pkey" PRIMARY KEY, btree (id)
Foreign-key constraints:
  "angebot_auto_fkey" FOREIGN KEY (auto) REFERENCES autos(id)
Referenced by:
  TABLE "auswahl" CONSTRAINT "auswahl_angebot_fkey" FOREIGN KEY (angebot) REFERENCES angebot(id)

test=*# \d auswahl
  Table "public.auswahl"
 Column  |  Type  | Modifiers
---------+---------+-----------
 kunde  | integer |
 angebot | integer |
 datum  | date  |
Foreign-key constraints:
  "auswahl_angebot_fkey" FOREIGN KEY (angebot) REFERENCES angebot(id)
  "auswahl_kunde_fkey" FOREIGN KEY (kunde) REFERENCES kunden(id)

test=*# \d kunden
  Table "public.kunden"
 Column |  Type  | Modifiers
--------+---------+-----------
 id  | integer | not null
 name  | text  |
Indexes:
  "kunden_pkey" PRIMARY KEY, btree (id)
Referenced by:
  TABLE "auswahl" CONSTRAINT "auswahl_kunde_fkey" FOREIGN KEY (kunde) REFERENCES kunden(id)

test=*# select k.name as kunde, a.name as auto  from auswahl au left join kunden k on au.kunde=k.id left join angebot an on au.angebot=an.id left join autos a on an.auto=a.id;
 kunde | auto
-------+------
(0 rows)

test=*#

Mahlzeit.
 
Danke!
hier nochmal mein Ansatz:
Sah genauso aus, nur dass ich in der selben Reihenfolge RIGHT JOINS nutzen wollte, und in der FROM-Anweisung die Tabelle "auto a" hatte, weil er ohne sagte, dass er a.name nicht kennt. aber mit diesem Eintrag kannte er k.id nicht. Lag wahrscheinlich an der falschen JOIN "Richtung"
 
Naja ;-)
... okay, stimmt schon.
Aber ich habe ja beschrieben, was mein Fehler war.
Ich war wirklich fester Überzeugung, ich müsste mich rechts herum orientieren. Und dann kann er offensichtlich die Tabellen nicht zuordnen.
 
Jetzt habe ich aber doch noch eine Frage...

Ich möchte gerne nur die Angebote für einen bestimmten Kunden Anzeigen.
Hier mein Ansatz ;-) :
SELECT K.Name, A.Auto FROM Auswahl AU LEFT JOIN Kunden K ON AU.Kunde=K.ID AND K.Name="Meier"...

Dann bekomme ich das selbe Ergebnis, nur dass alle anderen Kunden "NULL" im Feld Name stehen haben...

Muss ich hier dann nicht doch einen RIGHT JOIN benutzen?
 
finde den Unterschied!

Code:
test=*# select k.name as kunde, a.name as auto  from auswahl au left join kunden k on au.kunde=k.id left join angebot an on au.angebot=an.id left join autos a on an.auto=a.id;
  kunde  |  auto  
---------+--------
 kunde 1 | auto 1
 kunde 2 | auto 2
(2 rows)

test=*# select k.name as kunde, a.name as auto  from auswahl au left join kunden k on au.kunde=k.id and k.name = 'kunde 1' left join angebot an on au.angebot=an.id left join autos a on an.auto=a.id;
  kunde  |  auto  
---------+--------
 kunde 1 | auto 1
  | auto 2
(2 rows)

test=*# select k.name as kunde, a.name as auto  from auswahl au left join kunden k on au.kunde=k.id left join angebot an on au.angebot=an.id left join autos a on an.auto=a.id where k.name = 'kunde 1';
  kunde  |  auto  
---------+--------
 kunde 1 | auto 1
(1 row)

Bitte nicht Join und Where-Conditions mixen.
 
Werbung:
Zurück
Oben