AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Datensätze vergleiche
Thema durchsuchen
Ansicht
Themen-Optionen

Datensätze vergleiche

Ein Thema von Dumpfbacke · begonnen am 1. Aug 2007 · letzter Beitrag vom 3. Aug 2007
Antwort Antwort
Seite 2 von 4     12 34      
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#11

Re: Datensätze vergleiche

  Alt 2. Aug 2007, 05:29
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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Dumpfbacke

Registriert seit: 10. Mär 2005
Ort: Mitten in Deutschland
329 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#12

Re: Datensätze vergleiche

  Alt 2. Aug 2007, 05:53
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
Tanja
  Mit Zitat antworten Zitat
Dumpfbacke

Registriert seit: 10. Mär 2005
Ort: Mitten in Deutschland
329 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#13

Re: Datensätze vergleiche

  Alt 2. Aug 2007, 05:54
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
Tanja
  Mit Zitat antworten Zitat
Dumpfbacke

Registriert seit: 10. Mär 2005
Ort: Mitten in Deutschland
329 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#14

Re: Datensätze vergleiche

  Alt 2. Aug 2007, 05:57
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
Tanja
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#15

Re: Datensätze vergleiche

  Alt 2. Aug 2007, 07:30
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
Heiko
  Mit Zitat antworten Zitat
Dumpfbacke

Registriert seit: 10. Mär 2005
Ort: Mitten in Deutschland
329 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#16

Re: Datensätze vergleiche

  Alt 2. Aug 2007, 07:43
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
Tanja
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.541 Beiträge
 
Delphi 11 Alexandria
 
#17

Re: Datensätze vergleiche

  Alt 2. Aug 2007, 07:53
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Dumpfbacke

Registriert seit: 10. Mär 2005
Ort: Mitten in Deutschland
329 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#18

Re: Datensätze vergleiche

  Alt 2. Aug 2007, 07:57
Zitat von DeddyH:
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.
Bei den zweiten Select habe ich es mittels where auf die hälfte der Datensätze begrenzt.

Tanja
Tanja
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#19

Re: Datensätze vergleiche

  Alt 2. Aug 2007, 08:02
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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.541 Beiträge
 
Delphi 11 Alexandria
 
#20

Re: Datensätze vergleiche

  Alt 2. Aug 2007, 08:06
Ein IMHO gute Seite zu dem Thema ist diese hier
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 4     12 34      


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 00:02 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