Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Datensätze vergleiche (https://www.delphipraxis.net/96898-datensaetze-vergleiche.html)

alzaimar 2. Aug 2007 05:29

Re: Datensätze vergleiche
 
Na ja, dann packt man ein Trennzeichen zwischen die einzelnen Felder, das sonst im Text nicht vorkommt. Es ist sowieso performanter, einen Hash zu erzeugen, und diesen für einen Vergleich heranzuziehen.

Dumpfbacke 2. Aug 2007 05:53

Re: Datensätze vergleiche
 
Zitat:

Zitat von hoika
Hallo

argzz

where not exists (select bla)

es heisst nicht not exists in (select() sondern not exists (select()


Heiko

Hallo Heiko,
mein Interbase 6 kennt kein exists. Ich bekomme immer die Fehlermeldung

Dynamic SQL Error
SQL error code = -104
Token unknown - line 2, char 14
exists

Tanja

Dumpfbacke 2. Aug 2007 05:54

Re: Datensätze vergleiche
 
Zitat:

Zitat von grenzgaenger
hallo tanja,

sag mal, sind die datensätze sortiert? falls ja, brauchst du die tabellen nicht in eine datenbank zu schreiben, sondern nur die beiden tabellen lesen, durchschleifen und die unterschiede ausgeben... sollte programmmässig in ein paar sekunden durchgelaufen sein.

aber die tabellen müssen nach dem primärschlüssel sortiert sein. sonst musst du immer die ganze tabelle durchhangeln und das geht in die zeit...

grüsse
gg

Nei die Daten sind nicht sortiert und kann sich jedes mal ändern.
Tanja

Dumpfbacke 2. Aug 2007 05:57

Re: Datensätze vergleiche
 
Zitat:

Zitat von marabu
Hallo Tanja,

eine weitere Möglichkeit: Vor dem Laden der Dateien ein Feld mit dem Hash-Wert aller Feldinhalte hinzufügen - oder auch nach dem Laden über eine MD5 UDF, einen Index auf den Hash setzen und ein UPDATE mit dem bereits gezeigten Sub-Select.

Freundliche Grüße

Hallo marabu,
kannst du mir sagen so ich so einen UDF bekommen kann und wie "Breit" dann der Hash-Wert ist. Dann würde ich es in eine neue Spalte einfügen und einen Index erzeugen. Dann sollte es ja schneller gehen.

Danke Tanja

hoika 2. Aug 2007 07:30

Re: Datensätze vergleiche
 
Hallo Tanja,

nimm mal eine kleine Tabelle und probier das mal aus

SQL-Code:
select * from
personal where not exists (select id from personal)
Im Bsp ist Personal die Tabelle und Id der PrimKey.
Das muss auch unter IB6 gehen.

btw: welche Version von IB6 ist drauf ?


Heiko

Dumpfbacke 2. Aug 2007 07:43

Re: Datensätze vergleiche
 
Zitat:

Zitat von hoika
Hallo Tanja,

nimm mal eine kleine Tabelle und probier das mal aus

SQL-Code:
select * from
personal where not exists (select id from personal)
Im Bsp ist Personal die Tabelle und Id der PrimKey.
Das muss auch unter IB6 gehen.

btw: welche Version von IB6 ist drauf ?


Heiko

Hallo Heiko,
ich habe hier die alte Version 6. Mit dem oben vor Dir geschrieben Select geht es zum Teil. Es kommt keine Fehlermeldung mehr wenn nicht kein Feldname hinter dem Where eingebe. Nur leider ist das Ergebis auch falsch, es kommt immer NULL und keine Ergebnismenge.

Tanja

DeddyH 2. Aug 2007 07:53

Re: Datensätze vergleiche
 
Zitat:

Zitat von Dumpfbacke
Nur leider ist das Ergebis auch falsch, es kommt immer NULL und keine Ergebnismenge.

Klar kommt kein Ergebnis, es sollte wohl keinen Datensatz ohne Primärschlüssel geben. :zwinker:

Dumpfbacke 2. Aug 2007 07:57

Re: Datensätze vergleiche
 
Zitat:

Zitat von DeddyH
Zitat:

Zitat von Dumpfbacke
Nur leider ist das Ergebis auch falsch, es kommt immer NULL und keine Ergebnismenge.

Klar kommt kein Ergebnis, es sollte wohl keinen Datensatz ohne Primärschlüssel geben. :zwinker:

Bei den zweiten Select habe ich es mittels where auf die hälfte der Datensätze begrenzt.

Tanja

alzaimar 2. Aug 2007 08:02

Re: Datensätze vergleiche
 
Also:
1. Ein UDF ist eine 'User Defined Function'. Wie das genau mit IB6 geht, weiss ich nicht, aber man wird dir bestimmt helfen.

Dessenungeachtet reicht es u.U. aus, für beide Tabellen einen Index auf ein Feld zu setzen, von dem man ausgehen kann, das es fast nur unterschiedliche Werte enthält (Den Namen z.B.).

Dann vergleicht man beide Tabellen mit einem Join. Das Liefert in relativ kurzer Zeit alle identischen Zeilen.
SQL-Code:
Select * 
from Tabelle1
     Join Tabelle2 on Tabelle1.IndexFeld = Tabelle2.IndexFeld
   and Tabelle1.Feld1  = Tabelle2.Feld1
   and Tabelle1.Feld2  = Tabelle2.Feld2
   ...
Wenn man nur die Unterschiede möchte, dann verwendest Du einfach einen Full Join:

SQL-Code:
Select * 
from Tabelle1
     Full Join Tabelle2 on Tabelle1.IndexFeld = Tabelle2.IndexFeld
   and Tabelle1.Feld1  = Tabelle2.Feld1
   and Tabelle1.Feld2  = Tabelle2.Feld2
   ...

where Tabelle1.IndexFeld is null
   or Tabelle2.IndexFeld is null
willst Du nur die Datensätze, die in Tabelle1 ABER NICHT in Tabelle2 sind, dann einen LEFT JOIN
SQL-Code:
Select * 
from Tabelle1
     LEFT Join Tabelle2 on Tabelle1.IndexFeld = Tabelle2.IndexFeld
   and Tabelle1.Feld1  = Tabelle2.Feld1
   and Tabelle1.Feld2  = Tabelle2.Feld2
   ...

where Tabelle2.IndexFeld is null
Das sollte auch bei 800.000 Zeilen in vertretbarer Zeit durchzuführen sein. Bei SQL gilt: Probieren und Indexieren.

Um nun die Zeilen eindeutig zu identifizieren, solltest du ihnen vorher eine 'AutoInc'-Spalte, also einen PrimaryKey verpassen.

DeddyH 2. Aug 2007 08:06

Re: Datensätze vergleiche
 
Ein IMHO gute Seite zu dem Thema ist diese hier


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:06 Uhr.
Seite 2 von 4     12 34      

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