Also für Zukunft:
Mach Dir das Leben nicht unnötig schwer! Programmierer (meint man) sind faul und gehen immer den Weg des geringsten Widerstandes (bzw. der geringstnötigen Gedächtnisleistung
)
Daher hier meine 10 Gebote für den faulen Datenbankmenschen:
1. Benenne Deine Tabellen nach ihrem Hauptinhalt
2. verwende den Plural (Kunden nicht: Kunde) - macht später die Querys leichter lesbar
3. Benenne Zwischentabellen (auch Verknüpfungstabellen genannt) nach den Tabellen, auf die sie verweisen und verwende einen Unterstrich zur Trennung z.B. Tabellen: Kunden,Standorte Zwischentabelle: Kunden_Standorte
4. Benenne das Schlüsselfeld des Primärschlüssels genauso wie die Tabelle, nur setze ein 'Id' davor also: 'IdKunden'
5. denke Dir einen 1-Stelligen Code für den DatenTyp aus und stelle diesen jedem Feldnamen voran, es sei denn es ist ein Id-Feld z.B.
iFarbe (Integer),
cNummer (char oder Varchar)
lAktiv (Logisch/Boolean/Bit)
tBeschreibung (Text) - das erleichtert Dir in Delphi die korrekte Ansprache der Felder (AsInteger,AsString etc)
6. verwende immer wieder die gleichen FeldNamen für die gleichartige Dinge (zb. Tabelle: Funktionen / Felder: IdFunktionen,cBezeichnung | Tabelle: Taetigkeiten / Felder: IdTaetigkeiten,cBezeichnung)
7. Wenn eine Eigenschaft eines Dinges, das Du in eine Tabelle stopfen möchtest mehr Werte annehmen kann, als Deine MausHand an freien Fingern hat, wenn alle Tasten gedrückt sind, dann pack es in eine Detailtabelle (Z.B. Tabelle: Rufnummern Feld: idRufnummernTyp / Tabelle: RufnummernTyp Felder: idRufnummernTyp,cBezeichnung Werte: 'Festnetz privat','Festnetz Büro','Funk privat','Funk dienstlich','Fax privat','Fax Büro','Pager privat','Pager dienstlich')
8. verwende Aliasse in Selects, die sich auf mehr als eine Tabelle beziehen, nutze für Haupttabellen wenn's geht 1 Buchstaben, für ZwischenTabellen 2 z.B. Tabellen: Kunden, Adressen,Kunden_Adressen dann :
SQL-Code:
select K.cVorname,
K.cName,
A.cStrasse,
A.cNummer,
A.cPlz,
A.cOrt
from Kunden K
left outer join Kunden_Adressen KA
on KA.idKunden = K.idKunden
left outer join Adressen A
on A.idAdressen = KA.idAdressen
where K.iGenus = 0
mit Aliassen sind 'K', 'A' und 'KA' gemeint
9. Nutze wenn immer möglich joins statt Unterabfragen. Unterabfragen (Subselects) sind zwar oft schneller vom Programmierer zu formulieren, meist jedoch deutlich weniger performant und nicht in allen
db-Systemen verfügbar (
MySQL bis dato soviel ich weis z.B. unterstützt keine Subselects).
10. Wenn Du kannst bleibe so ANS-
SQL-konform wie möglich - erleichtert ungemein den Wechsel des Datenbanksystems. (Die einzige Versuchung der ich beim MS-
SQL-Server meist nicht widerstehen kann sind die dort möglichen case-STatements in Selectanweisungen - sau-bequem
)
Ende der Gebote
Also, Dein select von 16:26 Uhr "verstößt" gegen Faulheitsregel Nummer 8
ausserdem machst Du einen Cross-join (verknüpfe alle Datensätze aus Tabelle Kunde mit allen aus Tabelle Standorte) um ihn anschließend mit Distinct wieder einzugrenzen = ZuHause>Sydney>Tokio>NewYork>Tokio>Sydney>KneipeAn DerEcke
Wenn Delphi (nicht
BDE oder DatenbankSystem) diese Meldung bringt, dann hast Du wahrscheinlich doppelt auf Deine TQuery-Komponente geklickt, im daraufhin erscheinenden Dialog Felder hinzugefügt (möglicherweise auch alle), anschließend die Tabellenstruktur in Datenbank geändert (Feld hinzugefügt) und vergessen in Feldliste der TQuery dieses Feld hinzuzufügen. dann findet die TDatasSource das Feld nicht und meckert.
So. Genug jetzt.