Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   DB-Abfrage Frage ;-) (https://www.delphipraxis.net/169529-db-abfrage-frage-%3B.html)

hansklok 26. Jul 2012 21:48

Datenbank: SQLLite • Version: 3.7.3 • Zugriff über: RealBasic

DB-Abfrage Frage ;-)
 
Liebe Community,

ich habe folgende Tabellen erstellt:

Code:
CREATE TABLE Persons(PersonID Integer, Gender Integer, NameID Integer, Visible Boolean, PRIMARY KEY(PersonID))
CREATE TABLE Names(NameID Integer, SurnameID Integer, Givenname VarChar(120), PRIMARY KEY(NameID))
CREATE TABLE Surnames(SurnameID Integer, Surname VarChar(120), PRIMARY KEY(SurnameID))
CREATE TABLE Givennames(GivennameID Integer, Givenname VarChar(120), PRIMARY KEY(GivennameID))
Das funktioniert alles auch. Folgendes, ich habe zwei Listboxen. Die Eine listet alle vorhandenen Nachnamen (Givennames) und die zweite Listbox soll, wenn ein Nachname markiert wird, alle Personen mit diesem Nachnamen ausgeben, aber mit dem zugehörigen Vornamen der Person. Ich bekomme einfach keine funktionierende Abfrage hin:

Code:
SELECT * FROM Persons, Names WHERE Names.SurnameID=" + ID
ID gibt die jeweilige Nachnamen-ID aus der ersten Listbox wieder (sie wurde in eine Spalte übergeben).

Kann mir bitte jemand helfen? Es geht ganz einfach um eine Verknüpfung von verschiednen Tabellen.

Gruß hansklok

himitsu 26. Jul 2012 22:05

AW: DB-Abfrage Frage ;-)
 
Sicher daß man Strings mit + konkateniert?

Und schön ist es auch, wenn man z.B. sowas wie Fehlermeldungen gesagt bekommt, welche man allen Anderen einfach so verschweigt.
Fehlerbeschreibungen sind aber auch absolut nicht hilfreich, für die Behebung eines Problems.

hansklok 26. Jul 2012 22:21

AW: DB-Abfrage Frage ;-)
 
sorry,

ich weiß, dass ich hier in einem Delphi-Forum bin. Ich programmiere auch mehr mit Delphi, als mit Realbasic, ich habe hier nur sehr gute Erfahrung bezüglich des Feedbacks gemacht und habe mich deshalb hier an euch gewandet.

Also
Zitat:

Sicher daß man Strings mit + konkateniert?
Es handelt sich hier um Codeschnipsel, in Realbasic werden DB-Abfragen mithilfe eines "Anweisungsstring" verarbeitet. Das stimmt schon so.

Vielleicht kann ichs anders erklären. Um nicht unnötige doppelte Einträge in meiner DB zu haben, habe ich eine Tabelle für Vornamen und eine für Nachnamen angelegt. Jeder Person hat einen Namensdatensatz (Tabelle Namen), die einen Verweis auf den Vornamen und den Nachnamen enthalten.

Listbox 1 enthält alle Nachnamen. Klickt man auf einen Nachnamen, so wird Listbox2 aktualisiert. Hierfür fehlt mir aber der Ansatz, da ich mich mit DB's noch nicht so auskenne.

Wie kann ich das lösen?

Jonas Shinaniganz 26. Jul 2012 22:34

AW: DB-Abfrage Frage ;-)
 
So spontan, müsste Givenname VarChar(120) nicht in der Names Tabelle ein Int sein?

Edit: und GivennameID heißen nach deinem System?

jfheins 26. Jul 2012 22:35

AW: DB-Abfrage Frage ;-)
 
Auch von mir erstmal ein paar Anmerkungen:

1. Namen mit ID's kommt mir sehr komisch vor. Warum benutzt du 4 Tabellen wo eine reichen würde? Zudem wird GivennameID nicht benutzt;
das Feld Names.Givenname ist ja VARCHAR. Eine 1:n oder n:m Beziehung sehe ich nämlich nirgends. (Sag mit bitte nicht sowas wie
"In dem Varchar Feld steht eine Liste von kommagetrennten ID's")
1a) Da du gerade sowas wie Normalisierung ansprichst: Die doppelten Einträge würde ich bei Namen tatsächlich in Kauf nehmen.
Jede Person hat in der Regel nur einen Namen, wenn zwei den gleichen Namen haben haben sie sonst meist wenig am Hut.
Und wenn sich der eine Name ändert, dann heißt die andere Person noch genau so wie vorher.

2. Du verwechselst da was:
Zitat:

Die Eine listet alle vorhandenen Nachnamen (Givennames)
Nachname auf Englisch ist "surname", "last name" oder "family name".
Vorname wird mit "first name", "given name" oder "forename" übersetzt. Also entweder hast du das in deinem Post durcheinandergebracht
oder ich würde ein kleine Umbenennungsaktion vorschlagen :mrgreen:

3. Du joinst zwei Tabellen ohne eine Bedingung zwischen diesen beiden anzugeben, das ist .... ungewöhnlich :wink:

hansklok 26. Jul 2012 22:37

AW: DB-Abfrage Frage ;-)
 
..so nach weiterem Zufallsgefummel habe ich die richtige Abfrage endlich gefunden:

Code:
SELECT * FROM Persons, Names WHERE Names.NameID=Persons.PersonID AND Names.SurnameID=" + ID
Zitat:

In dem Varchar Feld steht eine Liste von kommagetrennten ID's
Richtig, da stehen kommasepariert die IDs zu den Vornamen drinnen, die dann durch eine Funktion durch die jeweiligen Vornamen ersetzt werden. Da das ganze eine genealogische DB werden soll, ist das durchaus sinnvoll.

Kann sein, dass ich die Given- und Surnames durcheinandergebracht habe...

Ich bitte das Thema zu schließen und danke für den Einsatz ;-)

Nächtlicher Gruß hansklok

Sir Rufo 26. Jul 2012 22:43

AW: DB-Abfrage Frage ;-)
 
Zitat:

Zitat von Jonas Shinaniganz (Beitrag 1176018)
So spontan, müsste Givenname VarChar(120) nicht in der Names Tabelle ein Int sein?

Edit: und GivennameID heißen nach deinem System?

Genau so ... aber scheint wohl egal zu sein, er hat ja was er will ;)

sx2008 27. Jul 2012 00:59

AW: DB-Abfrage Frage ;-)
 
Ich kann nur empfehlen, gleich die SQL-92 Join-Syntax zu lernen.
SQL-Code:
-- alte Syntax (implicit join notation)
SELECT * FROM Persons, Names WHERE Names.NameID=Persons.PersonID AND Names.SurnameID=:ID

-- neue, besere Syntax (explict join notation)
SELECT * FROM Persons INNER JOIN Names ON Names.NameID=Persons.PersonID WHERE Names.SurnameID=:ID

mkinzler 27. Jul 2012 06:37

AW: DB-Abfrage Frage ;-)
 
Und besser Tabellenaliase verwenden.

Jumpy 27. Jul 2012 06:56

AW: DB-Abfrage Frage ;-)
 
Ist auf jeden Fall ein gutes (einfaches) Beispiel dafür, das zuviel Normalisierung den Komplexitätsgrad der Abfrage erhöht, weswegen man uns in der Schule gesagt hat: "Leute macht nach der 3. Normalform schluß (ausser in Ausnahmefällen)".


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:31 Uhr.
Seite 1 von 2  1 2      

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