×
produktlogotitle

Seite: ace_abfragen
Diese Seite wurde aktualisiert am 18.04.2021

LOGIN
Benutzer:
Passwort:
 
   if1.net-schulbuch.de

 

Abfragen

Wie nutze ich die Beziehung zwischen Tabellen in einer Abfrage?

 

Auftrag: Stelle erst mal ganz allgemein fest, welche Bücher die Leserinnen und Leser entliehen haben!

Erster Versuch:

Wir wollen Vorname und Nachname des Lesers / der Leserin sowie die Nummer des Buch-Exemplars anzeigen lassen:

 

 

Das Ergebnis ist eine Enttäuschung - und merkwürdig!

Nach kurzem "Nachdenken" erscheint eine weiße Seite, auf der nur steht:

#Fatal error: Out of memory (allocated 701464576) (tried to allocate 4096 bytes) in /homepages/45/d83308485/htdocs/buch/prdct/i122/!content/a/c/b/sqlabfrage.tcml.prg on line 85

Wo kommen das her?? Wieso ist der Speicher übergelaufen (Out of memory)?

Die Tabelle "Leser" hat 1439 Zeilen, die Tabelle "Exemplar" 3495 Zeilen.

Das System hat versucht, den Vor- und Nachnamen des ersten Lesers zusammen mit allen IDs aus der Exemplar-Tabelle anzuzeigen (3495), dann Vor- und Nachnamen des zweiten Lesers zusammen mit allen IDs aus der Exemplar-Tabelle, dann der dritte, der vierte usw. alle 1439 Leser durch!

Das werden dann 1439 * 3495 = 5 029 305 Zeilen, kein Wunder, dass das System ausrastet.

Und wieso versucht er das? - Wir haben die Beziehung gar nicht verwendet!

Die Beziehung bedeutet ja, dass nur die Exemplare betrachtet werden sollen, die die zum Leser passende LeserID enthalten!

 

Eingabe der Beziehung

Wir ergänzen also die Abfrage und schreiben hinter "from" statt "Leser, Exemplar" nun

Leser verbunden mit Exemplar wobei Leser.ID=Exemplar.LeserID
select... from Leser JOIN Exemplar ON Leser.ID=Exemplar.LeserID

SELECT Leser.Vorname, Leser.Nachname, Exemplar.ID
FROM Leser JOIN Exemplar ON Leser.ID=Exemplar.LeserID;

und erhalten:

eine Ausgabe, die vernünftig aussieht (obwohl wir sie immer noch nicht kontrollieren können).

Eine andere Möglichkeit ist

SELECT Leser.Vorname, Leser.Nachname, Exemplar.ID
FROM Leser, Exemplar WHERE Leser.ID=Exemplar.LeserID;

  

Das ist zwar nicht richtig, wird von den Datenbankprogrammen aber so umgesetzt wie oben beschrieben (mit inner Join und on).

 

Die nach Namen aufsteigend sortierte Liste der Leserinnen/Leser mit den von ihnen entliehenen Buchnummern erhält man so:

SELECT Leser.Vorname, Leser.Nachname, Exemplar.BuchID
FROM Leser JOIN Exemplar ON Leser.ID=Exemplar.LeserID
ORDER BY Leser.Nachname;
 

 

Kann man  nicht die Buchtitel anzeigen anstelle der BuchID?

Dann brauchen wir in der Entwurfsansicht noch die dritte Tabelle "Buch". Diese ist durch den Fremdschlüssel "BuchID" in Exemplar verbunden.

Leser
verbunden mit Exemplar wobei Leser.ID=Exemplar.LeserID
verbunden mit Buch wobei Buch.ID = Exemplar.BuchID

SELECT Leser.Vorname, Leser.Nachname, Buch.Titel
FROM Leser 
JOIN Exemplar ON Leser.ID=Exemplar.LeserID
JOIN Buch ON Buch.ID = Exemplar.BuchID
ORDER BY Leser.Nachname;

 

und das Ergebnis ist (mit einiger Verzögerung) eine (immer noch lange) Liste mit allen entliehenene´Büchern sortiert nach Lesernamen.

 

 

 

 

 

 

Impressum
© 2023  Net-Schulbuch.de
10.00  0.1021  8.1.28