Datenbank: ADS • Zugriff über: TAdsTable
Elegantes auslesen aller Werte eines Feldes
Hi,
folgende Problemstellung: Ich habe eine Datenbank/Tabelle, auf die ich mit einer TTable zugreife. In dieser Tabelle gibt es ein Feld "Ort". Ich möchte alle Orte auslesen und in eine Stringlist kopieren. In der Stringlist sollen die ausgelesenen Orte jeweils einmal vorkommen. Die einfachste Möglichkeit wäre nun eigendlich folgendes:
Delphi-Quellcode:
sl:=TStringlist.create;
sl.sorted:=true; sl.duplicates:=dupignore; DieTabelle.first; while not DieTabelle.eof do begin sl.add(DieTabelle.fieldbyname('Ort').asstring); DieTabelle.next; end; etc. Bei einer Tabelle, in der wenige Orte sehr oft vorkommen, ist dies allerding nicht die effizienteste vorgehensweise. Beispiel: In der Tabellen kommen jeweils 2000 mal der Ort Köln, Hamburg und Berlin vor. Insgesamt besitzt die Tabelle somit 6000 Einträge. Als Ergebnis sollen letztendlich 3 Einträge herauskommen. Dazu werden im oberen Beispiel aber 6000 Zugriffe auf die Tabelle durchgeführt. Da muss es doch eine bessere Lösung geben. Oder? |
Re: Elegantes auslesen aller Werte eines Feldes
gibts es dazu nicht den "group by" befehl von sql? :-)
oder wenn du es dir umständlicher machen möchtest, dann prüfst du vor dem einfügen in deine stringliste ob der neu einzufügende wert bereits vorhanden ist. etwa so:
Delphi-Quellcode:
if sl.IndexOf(DieTabelle.fieldbyname('Ort').asstring)>-1 then
sl.add(DieTabelle.fieldbyname('Ort').asstring); |
Re: Elegantes auslesen aller Werte eines Feldes
Nimm doch statt einer TTable z.B. eine TQuery
und selectiere mit "distinct" ... Gruß Matthias |
Re: Elegantes auslesen aller Werte eines Feldes
Hi,
bei MySQL würde ich es über DISTINCT machen
SQL-Code:
Gibt jeden Ort nur einmal zurück
select DISTINCT(Ort) from Tabelle
Ich denke einen ähnlichen Befehl sollte es auch bei deiner DB geben. |
Re: Elegantes auslesen aller Werte eines Feldes
Zitat:
das brauche ich eigendlich nicht zu prüfen, da mit "sl.duplicates=dupignore" automatisch beim Einfügen der doppelte Eintrag ignoriert wird. Eigendlich ging es mir darum, mit so wenig wie möglichen Zugriffen auf die Tabelle alle vorhandenen Orte herauszufiltern. Viele Grüße Gerd |
Re: Elegantes auslesen aller Werte eines Feldes
Dann nimm den Vorschlag mit distinct - der ADS optimiert dann die Tabellenzugriffe. Sinnvoll wäre es, wenn Du auf das Feld "Ort" auch einen Index hast.
|
Re: Elegantes auslesen aller Werte eines Feldes
An alle mit dem Hinweis auf SQL und Distinct.
Danke erst mal für die Antworten. Aber...... Mich interessiert auch das Hintergrundwissen. Ist eben ein Sport für mich, Problemstellungen selber zu lösen bzw. zu begreifen und nicht auf vorhandenes in Form einer "Black Box" zurückzugreifen. Daher ist die Verwendung von TTable für mich Voraussetung. Viele Grüße Gerd |
Re: Elegantes auslesen aller Werte eines Feldes
Dann könntest Du ja, wenn es um Tabellenoptimierung geht, auch folgende Vorgehensweise verwenden:
Oder Du bastelst Dir einen intelligenten Suchalgorithmus, der auf den jeweils nächsten Ort springt (z.B. durch Erhöhen der ASCII-Werte des aktuellen Ortes und anschliessendem Locate). |
Re: Elegantes auslesen aller Werte eines Feldes
Zitat:
Zitat:
|
Re: Elegantes auslesen aller Werte eines Feldes
:gruebel: Warum nur so umständlich? Nimm ne TAdsQuery und sage dem SQL
SQL-Code:
und dann rein in die StringList
select distinct Ort from Postleitzahlen order by Ort
Delphi-Quellcode:
AdsQuery.SQL.Text := 'select distinct Ort from Postleitzahlen order by Ort';
AdsQuery.Open; AdsQuery.First; while not AdsQuery.Eof do begin SL.Add(AdsQuery.FieldByName('Ort').AsString); AdsQuery.Next; end; AdsQuery.Close; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:09 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