Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi FOREIGN KEY ausgeben? (https://www.delphipraxis.net/171201-foreign-key-ausgeben.html)

AlexII 25. Okt 2012 13:19

Datenbank: SQLite • Version: 3 • Zugriff über: SQLite4Delphi Wrapper von Tim Anderson

FOREIGN KEY ausgeben?
 
Hallo,

ich hab ein Problem mit der Foreign Key Ausgabe, bzw. mit der Ausgabe die hinter einem FK steht.

Also ich hab drei Tabellen:

Zitat:

Buch(BuchID, Titel, Autor)
Leser(LeserID, Name, Vorname)
Ausleihe(BuchID, LeserID, Ausleihdatum, Rückgabedatum)
BuchID und LeserID sind in der Tabelle Ausleihe Fremdschlüssel.

Nun meine Frage wie ich in der Tabelle Ausleihe den Titel des Buches und den Namen des Entliehers ausgebe? Mir gelingt die SELECT-Abfrage nicht. Vor allem wenn ein Buch nicht entliehen wurde und der Name des Entlieher leer sein muss.

Bin für jede Hilfe dankbar!

DeddyH 25. Okt 2012 13:28

AW: FOREIGN KEY ausgeben?
 
Ich nehme an, SQLite beherrscht JOINs?
SQL-Code:
SELECT
  B.Titel, L.Name, L.Vorname
FROM
  Buch B
JOIN
  Ausleihe A ON A.BuchID = B.ID
JOIN
  Leser L ON L.ID = A.LeserID
ORDER BY
  B.Titel, L.Name, L.Vorname
[edit] Diese Abfrage nutzt INNER JOINs, d.h. Du bekommst nur Datensätze geliefert, die in allen 3 Tabellen Entsprechungen aufweisen. Ersetzt Du JOIN durch LEFT JOIN, dann bekommst Du alle Bücher. Gibt es keinen Entleiher, wird dieser mit NULL zurückgegeben. [/edit]

Sir Rufo 25. Okt 2012 13:35

AW: FOREIGN KEY ausgeben?
 
Die PK Felder würde ich immer einfach als ID angeben:

Buch( ID, Titel, Autor )
Leser( ID, Name, Vorname )
Ausleihe( Buch_ID, Leser_ID, Ausleihdatum, Rückgabedatum )

Warum, dazu gleich mehr.

Warum sollte in der Tabelle Ausleihe ein Eintrag vorhanden sein, wenn das Buch nicht ausgeliehen ist?

Hier mal die Abfrage über alle Bücher, und wenn ausgeliehen, dann mit den Leser-Informationen:
Code:
SELECT Buch.ID, Buch.Titel, Buch.Autor, Ausleihe.Ausleihedatum, Ausleihe.Rückgabedatum, Leser.Name, Leser.Vorname
FROM Buch
LEFT JOIN Ausleihe ON Ausleihe.Buch_ID = Buch.ID
LEFT JOIN Leser ON Ausleihe.Leser_ID = Leser.ID
und jetzt stellt man fest, dass man das sehr schön lesen kann (Buch.ID statt Buch.BuchID - da fängt man ja zu stottern an)

AlexII 25. Okt 2012 13:52

AW: FOREIGN KEY ausgeben?
 
Ist mir irgendwie schwer zu verstehen, darf ich vllt ein anderes Beispiel zeigen (mit zwei Tabellen), das bisschen einfacher ist, wie ich sehe muss wohl klein anfangen.

Buch(ID, FK_Leser_ID, Titel, Autor)
Leser(ID, Name, Vorname)

Nun möchte ich alle Bücher anzeigen, und wenn entliehen dann mit den Namen der Leser.

Danke noch mal!

DeddyH 25. Okt 2012 13:58

AW: FOREIGN KEY ausgeben?
 
In den beiden Tabellen gibt es aber keine Info, ob das Buch entliehen ist.

mkinzler 25. Okt 2012 13:59

AW: FOREIGN KEY ausgeben?
 
SQL-Code:
select
    b.ID, b.Titel, b.Autor,
    IfNull( '', l.Name || l.vorname) as Leiher
from
    buecher b
        left join Leser l on l.Id = b.LeserID;

AlexII 25. Okt 2012 14:00

AW: FOREIGN KEY ausgeben?
 
Zitat:

Zitat von DeddyH (Beitrag 1188361)
In den beiden Tabellen gibt es aber keine Info, ob das Buch entliehen ist.

Das heißt hier muss ich kein FK verwenden?

mkinzler 25. Okt 2012 14:02

AW: FOREIGN KEY ausgeben?
 
Sagen wir mal so, in deinem Fall wird ja nur hinterlegt, wer das Buch gerade ausgeliehen hat. Es gibt keine Historie.

AlexII 25. Okt 2012 14:09

AW: FOREIGN KEY ausgeben?
 
Zitat:

Zitat von mkinzler (Beitrag 1188364)
Sagen wir mal so, in deinem Fall wird ja nur hinterlegt, wer das Buch gerade ausgeliehen hat. Es gibt keine Historie.

Was heißt das genauer? :gruebel:

mkinzler 25. Okt 2012 14:10

AW: FOREIGN KEY ausgeben?
 
Sobald das Buch zurückgegeben wird, weiss man nicht mehr, ob es schon einmal verliehen war. Bei der 1. Lösung ist das Problemlos möglich.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:20 Uhr.
Seite 1 von 4  1 23     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz