Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi schnellere Suche in Datenbank (https://www.delphipraxis.net/38825-schnellere-suche-datenbank.html)

Gambit 24. Jan 2005 17:24


schnellere Suche in Datenbank
 
Hallo,
ich habe hier folgendes Problem:
Ich habe eine alte Foxpro-Datenbank mit Kundendaten so auch einer Kundennummer. Es existiert kein Primärschlüssel! Die Kundennummern sind zwar einzigartig, es ist aber nicht garantiert, dass eine neu vergebene Kundennummer stets einen numerisch höheren Wert hat als alle anderen vorhandenen. Ich soll nun erfassen, ob neue Kunden hinzugefügt werden.
Die einzige Lösung, die ich bisher habe, ist in der aktuellen DB Datensatz für Datensatz durchzugehen und zB mit der Kundennummer eine Select-Anweisung auf die ältere Version der Datenbank durchzuführen. Bekomme ich nichts zurück, habe ich einen neuen Kunden.
Das geht zwar, dauert aber elendig lange, weil die DB etwa 40.000 Datensätze hat und ich somit pro Durchgang 40.000x40.000 Select -Anweisungen durchführe. Und das um vielleicht festzustellen, dass ein Kunde dazugekommen ist.
Wie gesagt, ist es eine Foxpro-Datenbank, keine Trigger, keine Protokolle und kein Primärschlüssel.

Weiß jemand Rat?

Gruß

Gambit

Robert_G 24. Jan 2005 17:37

Re: schnellere Suche in Datenbank
 
Könntest du nicht beide TAbellen auf einmal laden?
Damit ein ...
SQL-Code:
SELECT A
FROM  B
WHERE C not in (SELECT C
                 FROM OldB)
... möglich wird?

Gambit 24. Jan 2005 17:44

Re: schnellere Suche in Datenbank
 
Könntest du mir das nochmal etwas genauer erklären? Angenommen meine aktuelle Datenbanktabelle heißt Kunden und die ältere Kopie davon KundenAlt und die Suchspalte KDNNR. Wie soll dann die Select-Anweisung lauten?

Robert_G 24. Jan 2005 18:14

Re: schnellere Suche in Datenbank
 
Zitat mit ausgetauschten Bezeichnern
Könntest du nicht beide TAbellen auf einmal laden?
Damit ein ...
SQL-Code:
SELECT *
FROM  KundenAlt
WHERE KundenNr not in (SELECT KundenNr
                        FROM  KundenAlt)
... möglich wird?

Gambit 24. Jan 2005 18:20

Re: schnellere Suche in Datenbank
 
hmmm, das setzt voraus, dass Foxpro Unterabfragen kann, oder? Muss ich mal probieren...

Robert_G 24. Jan 2005 18:31

Re: schnellere Suche in Datenbank
 
Zitat:

Zitat von Gambit
hmmm, das setzt voraus, dass Foxpro Unterabfragen kann, oder? Muss ich mal probieren...

Du kannst auch eine andere museumsreife DB hernehmen um das hinzukriegen.
Du könntest die Daten durch MS Jet schleusen und darin dein SubQuery absetzen:
SQL-Code:
SELECT *
FROM  [ODBC;DSN=DeineOdbcDsn;uid=DeineUserID;pwd=DeinPassword;database=DeineDatenbank].[Kunden]
WHERE KundenNr not in (SELECT KundenNr
                        FROM  [ODBC;DSN=DeineOdbcDsn;uid=DeineUserID;pwd=DeinPassword;database=DeineDatenbank].[KundenAlt])
Wobei ich absolut kein Profi für Jet bin (aufgrund einer akuten Allergie gegen dieses scheußliche Ding ;) ).
Es könnte aber für deinen Fall reichen. :gruebel:

Gambit 24. Jan 2005 18:38

Re: schnellere Suche in Datenbank
 
im Moment habe ich eher das Problem, beide DB's zu laden um sie entsprechend anzusprechen. Was ich bisher in der Kürze geschrieben habe ist folgendes.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add('SELECT * FROM  sd_kdn WHERE kdnnr not in (SELECT kdnnr FROM sd_Kdn)') ;
  ADOQuery1.Open;
end;
wobei das natürlich Quatsch ist, weil jedesmal die gleiche DB angesprochen wird. Aber sonst scheint die Unterabfrage zu funzen...

in meinem Falle liegt die aktuelle DB im Verzeichnis DBREF und die Kopie im Verzeichnis DBWORK.
Ich habe zwei ADOQuerys wobei die eine mit sd_kdn im DBREF-Verzeichnis und die andere mit sd_kdn in DBWORK verbunden ist.

Gambit 24. Jan 2005 21:23

Re: schnellere Suche in Datenbank
 
Ich komm' da jetzt echt nicht weiter, wie macht man denn so eine Unteranfrage mit zwei Querys?

Gruß

Gambit

edit: Es klappt, wenn beide Datebanktabellen unter anderem Namen im gleichen Verzeichnis stehen. Die ADOConnection zeigt dann auf dieses Verzeichnis. Ich hätte allerdings lieber 2 Verzeichnisse gehabt, wie das dann geht, weiß ich auch noch nicht...


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:14 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