![]() |
Datenbank: SQLLite • Version: 3.7.3 • Zugriff über: RealBasic
DB-Abfrage Frage ;-)
Liebe Community,
ich habe folgende Tabellen erstellt:
Code:
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:
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))
Code:
ID gibt die jeweilige Nachnamen-ID aus der ersten Listbox wieder (sie wurde in eine Spalte übergeben).
SELECT * FROM Persons, Names WHERE Names.SurnameID=" + ID
Kann mir bitte jemand helfen? Es geht ganz einfach um eine Verknüpfung von verschiednen Tabellen. Gruß hansklok |
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. |
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:
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? |
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? |
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:
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: |
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:
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 |
AW: DB-Abfrage Frage ;-)
Zitat:
|
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 |
AW: DB-Abfrage Frage ;-)
Und besser Tabellenaliase verwenden.
|
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 21:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz