AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

DB-Abfrage Frage ;-)

Ein Thema von hansklok · begonnen am 26. Jul 2012 · letzter Beitrag vom 27. Jul 2012
Antwort Antwort
Seite 1 von 2  1 2      
hansklok

Registriert seit: 14. Apr 2004
Ort: Karlsruhe
318 Beiträge
 
Delphi 2010 Architect
 
#1

DB-Abfrage Frage ;-)

  Alt 26. Jul 2012, 22:48
Datenbank: SQLLite • Version: 3.7.3 • Zugriff über: RealBasic
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#2

AW: DB-Abfrage Frage ;-)

  Alt 26. Jul 2012, 23:05
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (26. Jul 2012 um 23:52 Uhr)
  Mit Zitat antworten Zitat
hansklok

Registriert seit: 14. Apr 2004
Ort: Karlsruhe
318 Beiträge
 
Delphi 2010 Architect
 
#3

AW: DB-Abfrage Frage ;-)

  Alt 26. Jul 2012, 23:21
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?
  Mit Zitat antworten Zitat
Benutzerbild von Jonas Shinaniganz
Jonas Shinaniganz

Registriert seit: 30. Aug 2011
249 Beiträge
 
Delphi XE5 Ultimate
 
#4

AW: DB-Abfrage Frage ;-)

  Alt 26. Jul 2012, 23:34
So spontan, müsste Givenname VarChar(120) nicht in der Names Tabelle ein Int sein?

Edit: und GivennameID heißen nach deinem System?
Die Leiter der Entwicklungsabteilung dreht total am Mausrad!
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#5

AW: DB-Abfrage Frage ;-)

  Alt 26. Jul 2012, 23:35
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

3. Du joinst zwei Tabellen ohne eine Bedingung zwischen diesen beiden anzugeben, das ist .... ungewöhnlich
  Mit Zitat antworten Zitat
hansklok

Registriert seit: 14. Apr 2004
Ort: Karlsruhe
318 Beiträge
 
Delphi 2010 Architect
 
#6

AW: DB-Abfrage Frage ;-)

  Alt 26. Jul 2012, 23:37
..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

Geändert von hansklok (26. Jul 2012 um 23:41 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: DB-Abfrage Frage ;-)

  Alt 26. Jul 2012, 23:43
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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#8

AW: DB-Abfrage Frage ;-)

  Alt 27. Jul 2012, 01:59
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
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: DB-Abfrage Frage ;-)

  Alt 27. Jul 2012, 07:37
Und besser Tabellenaliase verwenden.
Markus Kinzler
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.736 Beiträge
 
Delphi 6 Enterprise
 
#10

AW: DB-Abfrage Frage ;-)

  Alt 27. Jul 2012, 07:56
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)".
Ralph

Geändert von Jumpy (27. Jul 2012 um 07:59 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:39 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