Abfrage: ID mit Name aus anderer Tabelle linken?!

Hi!

Habe vor bei einer Abfrage in Access auflisten zu lassen, wer alles ein Buch ausgeliehen hat und wann er es ausgeliehen hat und wann er es zurückgegeben hat.

Meine Tabellen:

1.) Personen
ID
Vorname
Nachname
Geburtsdatum

2.) Buch
ID
Titel
ISBN

3.) Personen-Buch-Detail
ID
PersonenID
BuchID
Ausleihdatum
Rückgabedatum

4.) Personen-Buch-Detail-Archiv
ID
Personen ID
Ausleihdatum
Rückgabedatum

So, und jetzt will ich eine Abfrage schreiben, die mir alle Personen, die ein Buch jemals ausgliehen haben mit Name, Vorname auflisten und dann das Buch mit Name und dann noch Ausleihdatum und Rückgabedatum auflistet.
Wie mach ich das???
Kennt ihr irgendwelchen guten Tuts die sich mit Abfragen beschäftigen?

Danke schonmal im vorraus für eure Hilfe!

Tschööö

Hi!

Habe vor bei einer Abfrage in Access auflisten zu lassen, wer
alles ein Buch ausgeliehen hat und wann er es ausgeliehen hat
und wann er es zurückgegeben hat.

Meine Tabellen:

1.) Personen
ID
Vorname
Nachname
Geburtsdatum

2.) Buch
ID
Titel
ISBN

3.) Personen-Buch-Detail
ID
PersonenID
BuchID
Ausleihdatum
Rückgabedatum

Die ID hier kannst du dir sparen. Der Schlüssen besteht aus personenID und BuchID. Rückgabedatum brauchst Du auch nicht. Solange das Buch ausgeliehen ist, bleibt es in dieser Tabelle, danach wird es gelöscht un kommt in die Historie.

4.) Personen-Buch-Detail-Archiv
ID
Personen ID

BuchID fehlt

Ausleihdatum
Rückgabedatum

Der Schlüssel geht über PersonenID, BuchID und Ausleihdatum oder Rückgabedatum.

SELECT p.id, p.name, b.id, b.titel, a.ausleihdatum und so weiter
FROM Personen p, Personen_buch_detail_archiv a, Buch b
WHERE p.ID = a.PersonenID
AND a.BuchID = b.BuchID
ORDER BY a.ausleihdatum;

Gruß

Peter

PS: gute Bücher über SQL gibts ne Menge.
z.B. von Saake, Heuer oder von Misgeld
Schau mal bei terrashop oder im zvab nach.

So, und jetzt will ich eine Abfrage schreiben, die mir alle
Personen, die ein Buch jemals ausgliehen haben mit Name,
Vorname auflisten und dann das Buch mit Name und dann noch
Ausleihdatum und Rückgabedatum auflistet.
Wie mach ich das???
Kennt ihr irgendwelchen guten Tuts die sich mit Abfragen
beschäftigen?

Danke schonmal im vorraus für eure Hilfe!

Tschööö

SELECT p.id, p.name, b.id, b.titel, a.ausleihdatum und so
weiter
FROM Personen p, Personen_buch_detail_archiv a, Buch b
WHERE p.ID = a.PersonenID
AND a.BuchID = b.BuchID
ORDER BY a.ausleihdatum;

Ja aber bekomme ich dann nicht nur die IDs aufgelistet?
Ich will doch aber Name, Vorname usw…!

Nein, die Attribute, die angezeigt werden stehen doch direkt nach dem SELECT. Nach dem FROM stehen die Tabellen (hier mit Aliasnamen, damit man nicht zu viel schreiben muss). Und nach dem WHERE steht die Zeilenauswahl.

Probiers einfach mal aus und bau den SELECT aus.

Gruß

Peter

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

hi!

SELECT p.id, p.name, b.id, b.titel, a.ausleihdatum und so
weiter
FROM Personen p, Personen_buch_detail_archiv a, Buch b
WHERE p.ID = a.PersonenID
AND a.BuchID = b.BuchID
ORDER BY a.ausleihdatum;

was ist mit den aktuell ausgeliehenen Bücher? (by the way: selbes select per union verknüpfen, allerdings mit personen_buch_detail) - oder stehen diese auch bereit im archiv drinnen?

wobei ich noch immer nicht den sinn der archiv-tabele durchschaut habe (oder ist dies rein nur aus performance-/platz-gründen, um aktuelle entlehnungen schneller/einfacher handhaben zu können?

grüße,
tomh

Hallo,

die Archiv Tabelle brauchst Du, damit du den Schlüssel nicht beliebig erweitern musst. Ohne Archivtabelle kannst du ja jeden Datensatz so oft du willst eintragen. Irgendwann passiert mal ein Fehler und du weisst nicht mehr, wer jetzt gerade ein Buch hat oder nicht.

Du kannst die Archivtabelle wenn du willst schon beim Insert füllen. Dann hast Du bei der Rückgabe nur noch ein Update zu machen.

Du kannst auch einen OUTER JOIN benutzen oder eine UNION Abfrage. (Das ist vom Ergebnis her gleichwertig)

In deinem Modell solltest Du beachten, dass es eigentlich zwei unterschiedliche Entitäten gibt: Buch und Exemplar. Das Buch trägt die Information über Verlag, Autor, Titel. Das Exemplar wird angeschafft und ausgeliehen und zurückgebracht. Die Vormerkunden gehen auf das Buch.

Schau mal auf meiner Homepage unter http://www.fies-und-gemein.de. Da kannst du dir mal das Skript über Datenbanken 1 anschauen. Da ist ein Bibliotheksmodell drin.

Gruß

Peter

Danke, das du mich auf die Idee mit den Exemplaren hingewiesen hast, da bin ich zuerst gar nicht draufgekommen.
Danke natürlich auch für die Lösungsvorschläge!
Werd’ gleich mal wieder n weng drann rummbasteln.

Weiß einer von euch, wie ich mit VBA auf eine Kontrollbox in ner Tabelle zugreif? Des is irgendwie anders wie wenn man VB programmiert…*gg*

Hi!

die Archiv Tabelle brauchst Du, damit du den Schlüssel nicht
beliebig erweitern musst.
Ohne Archivtabelle kannst du ja
jeden Datensatz so oft du willst eintragen. Irgendwann
passiert mal ein Fehler und du weisst nicht mehr, wer jetzt
gerade ein Buch hat oder nicht.

Archiv- und Aktuelle Tabelle sehen (feldmäßig) gleich aus, den Schlüssel hab ich ja eigentlich mit dem Entlehndatum (und Person und Buch) eindeutig definiert (oder unterliege ich hier einen Irrtum?)

Du kannst die Archivtabelle wenn du willst schon beim Insert
füllen. Dann hast Du bei der Rückgabe nur noch ein Update zu
machen.

Ist bei uns auch gängige Praxis, allerdings bei Tabellen, wo man sehen will, wer wann was geändert hat (allerdings wird hier nur „geinserted“)

Du kannst auch einen OUTER JOIN benutzen oder eine UNION
Abfrage. (Das ist vom Ergebnis her gleichwertig)

Wobei ich der subjektiven Meinung bin, daß ein UNION schneller und ein OUTER JOIN leichter zu Warten ist.

In deinem Modell solltest Du beachten, dass es eigentlich zwei
unterschiedliche Entitäten gibt: Buch und Exemplar.

DAS verändert die Sache eigentlich vollkommen.

Grüße,
Tomh