Daten aus Fremdschlüsseltabellen abragen

Disco_Stu

Neuer Benutzer
Beiträge
2
Hi,

ich bin neu hier und muss gestehen, dass ich ein absoluter Anfänger im Bereich Datenbanken bin.

Aktuell versuche ich mir eine Abfrage zu basteln, mit der ich Daten aus mehreren verbundenen Tabellen abfragen kann.

Definiert sind u.a. folgende Tabellen:

Fahrzeug
ID_MODELL -> PK
ID_HERSTELLER -> FK
BEZEICHNUNG

Hersteller
ID_HERSTELLER -> PK
NAME

Nun möchte ich durch eine Abfrage der Modell_ID den Namen des Herstellers und die Bezeichnung des Fahrzeugs ausgeben:

codejix7a.jpg


Jetzt wird mir folgendes ausgegeben:

Fahrzeug ID: 1001
Hersteller: Volkswagen
Modell: Golf
Hersteller: Opel
Modell: Golf

Wie kann ich die Abfrage gestalten, damit ich nur den Hersteller des ausgewählten Fahrzeugs angezeigt bekomme und nicht alle angelegten Hersteller?
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.160
Hi,

ich bin neu hier und muss gestehen, dass ich ein absoluter Anfänger im Bereich Datenbanken bin.

Aktuell versuche ich mir eine Abfrage zu basteln, mit der ich Daten aus mehreren verbundenen Tabellen abfragen kann.

Definiert sind u.a. folgende Tabellen:

Fahrzeug
ID_MODELL -> PK
ID_HERSTELLER -> FK
BEZEICHNUNG

Hersteller
ID_HERSTELLER -> PK
NAME

Nun möchte ich durch eine Abfrage der Modell_ID den Namen des Herstellers und die Bezeichnung des Fahrzeugs ausgeben:

codejix7a.jpg


Jetzt wird mir folgendes ausgegeben:

Fahrzeug ID: 1001
Hersteller: Volkswagen
Modell: Golf
Hersteller: Opel
Modell: Golf

Wie kann ich die Abfrage gestalten, damit ich nur den Hersteller des ausgewählten Fahrzeugs angezeigt bekomme und nicht alle angelegten Hersteller?


Weil Du einen CROSS JOIN machst, Dir fehlt die JOIN-Condition. Guggst Du konkret krass:

Code:
test=*# select * from fahrzeug ;
 id_modell | id_hersteller | bezeichnung
-----------+---------------+-------------
         1 |             1 | golf
         2 |             2 | astra
(2 rows)

Time: 0,114 ms
test=*# select * from hersteller ;
 id_hersteller | name
---------------+------
             1 | vw
             2 | opel
(2 rows)

Time: 0,101 ms
test=*# select name, bezeichnung from fahrzeug , hersteller where fahrzeug.id_modell = 1;
 name | bezeichnung
------+-------------
 vw   | golf
 opel | golf
(2 rows)


Besser:

Code:
test=*# select name, bezeichnung from fahrzeug left join hersteller on fahrzeug.id_hersteller=hersteller.id_hersteller where fahrzeug.id_modell = 1;
 name | bezeichnung
------+-------------
 vw   | golf
(1 row)

Was Du noch verbessern solltest:

  • keine Bilder einfügen, sondern Code-Bereiche
  • Eingabeparameter prüfen, und bei Weitergabe an die DB escapen. Oder prepared Statements verwenden. Du öffnest SQL-Injections sämtliche Tore


Andreas
 
Werbung:

Disco_Stu

Neuer Benutzer
Beiträge
2
Super, vielen Dank für die schnelle und ausführliche Antwort. Die Abfrage funktioniert wunderbar.

Ich hatte die Code Funktion ganz übersehen und daher umständlich mit dem Screenshot hantiert.

Deine Anmerkungen werde ich berücksichtigen, danke nochmal :D
 
Oben