Delphi-PRAXiS

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)".

Furtbichler 27. Jul 2012 08:05

AW: DB-Abfrage Frage ;-)
 
Zitat:

Zitat von Jumpy (Beitrag 1176028)
...weswegen man uns in der Schule gesagt hat: "Leute macht nach der 3. Normalform schluß (ausser in Ausnahmefällen)".

Kann es sein, das Du das nicht ganz richtig wiedergibst?

Es sollte (imho) heißen: "Leute, macht MIT der 3.NF Schluss. In Ausnahmefällen schon vorher."

In der Realität wird die 3NF dem entsprechen, was man gemeinhin als Optimum betrachtet. Bei Performanceproblemen (BI, DWH etc.) erhöht Redundanz die Performance ganz beträchtlich.

Jumpy 27. Jul 2012 08:21

AW: DB-Abfrage Frage ;-)
 
Kleine Sprachverwirrtheit: Meinte das in dem Sinne:
Nachdem die 3. NF implementiert ist, macht Schluss.
Meinen also das gleiche.

Bzgl. der Ausnahmen so gehen die natürlich in beide Richtungen, wobei was ich so gelesen habe eher mehr Redundanz zugelassen wird (wie du es auch sagst und Beispiele gibst), als dass eine noch strengere NF angewandt wird. Für diesen Fall könnt ich auch gar kein gutes Beispiel anführen.

mkinzler 27. Jul 2012 08:38

AW: DB-Abfrage Frage ;-)
 
Zitat:

Nachdem die 3. NF implementiert ist, macht Schluss.
U.U noch die 3,5te Normalform ( Boyce-Codd)

p80286 27. Jul 2012 09:46

AW: DB-Abfrage Frage ;-)
 
@JFHeins
Ich könnte mir schon vorstellen, daß es sinnvoll ist, die Vornamen in eine eigene Tabelle auszulagern. Z.B um verschieden Schreibweisen und ihre Verwendung zu analysieren.
aber dann sollte die Namenstabelle ungefähr so aussehen

Code:
FamilyNameID,FirstNameId,FirstNameRank
Gruß
K-H

Furtbichler 27. Jul 2012 13:58

AW: DB-Abfrage Frage ;-)
 
Zitat:

Zitat von mkinzler (Beitrag 1176032)
Zitat:

Nachdem die 3. NF implementiert ist, macht Schluss.
U.U noch die 3,5te Normalform ( Boyce-Codd)

Vermutlich nähern wir uns bei einer weiteren Diskussion der 3,1415926..sten Normalform. Ich halte mich da raus, denn alleine die Möglichkeit überfordert meinen Intellekt.

Ich stoße allerdings nach kurzer Laienrecherche im Zusammenhang mit Boyce-Codd auf die "4NF" und nicht auf die 3,5. Sind das die gleichen paar Schuhe?

Im Übrigen gebe ich Dir und Jumpy Recht.

mkinzler 27. Jul 2012 14:11

AW: DB-Abfrage Frage ;-)
 
Zitat:

Ich stoße allerdings nach kurzer Laienrecherche im Zusammenhang mit Boyce-Codd auf die "4NF" und nicht auf die 3,5. Sind das die gleichen paar Schuhe?
Nein. Boyce-Codd ist eine Variante (Erweiterung) zur 3. NF, welche ursprünglich als "Abschwächung" dieser gedacht war, aber in Wirklichkeit diese verschärft.
http://de.wikipedia.org/wiki/Normali...28Datenbank%29

Im Normalfall ist die 3. NF komplett ausreichend

Blup 27. Jul 2012 14:38

AW: DB-Abfrage Frage ;-)
 
Aber bitte keine mit Komma getrennten IDs in einem Varchar()!
Das ist so ziemlich das schlimmste was (Nicht-)DB-Programmieren einer Datenbankstruktur antun könnnen.

BUG 27. Jul 2012 14:53

AW: DB-Abfrage Frage ;-)
 
Zitat:

Zitat von Blup (Beitrag 1176080)
Aber bitte keine mit Komma getrennten IDs in einem Varchar()!

Afaik wäre das ein Verstoß gegen die erste Normalform.

Wenn man das haben möchte, kann man sich die NF² bzw. objektrelationalen Erweitungen seiner bevorzugten Datenbank angucken. Nested Tables wären ein Stichwort.

Furtbichler 27. Jul 2012 15:33

AW: DB-Abfrage Frage ;-)
 
Zitat:

Zitat von mkinzler (Beitrag 1176072)
Zitat:

Ich stoße allerdings nach kurzer Laienrecherche im Zusammenhang mit Boyce-Codd auf die "4NF" und nicht auf die 3,5. Sind das die gleichen paar Schuhe?
Nein. Boyce-Codd ist eine Variante (Erweiterung) zur 3. NF, welche ursprünglich als "Abschwächung" dieser gedacht war, aber in Wirklichkeit diese verschärft.

Ist doch das gleiche, nur das mein Link daraus die 4.NF macht. Glauben wir einfach mal WiKi.
http://www.teialehrbuch.de/Kostenlos...ormalform.html


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:58 Uhr.

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