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 1 von 4  1 23     Letzte »    
Dumpfbacke

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

Datensätze vergleiche

  Alt 1. Aug 2007, 12:51
Datenbank: Interbase • Version: 6.01 • Zugriff über: IBX
Hallo,
ich hänge immernoch an meinem Problem mit den 800.000 Datensätze. Nun hänge ich an einer anderen Stellen, da nun die Wünsche geändert wurden. Ich beschreibe mal die Gegebenheiten und mein Problem. Villeicht könnt Ihr mir ja nochmals helfen.

Als Ergebnis sollte herrauskommen:
Welche sind neue Daten und bei welchen hat sicht etwas geändert.

Es liegen zwei CSV Dateien mit jewals fast 800.000 Datenstzäte vor. Diese beiden Dateien habe ich ich zwei Tabellen im Interbase geschrieben. (Kein Problem geht sehr zügig)

Die 1. Tabelle sind so aufgebaut

Feld1 VarChar(150) Character Set ISO8859_1
Feld2 VarChar(150) Character Set ISO8859_1
Fled3 VarChar(40) Character Set ISO8859_1
Feld4 VarChar(3) Character Set ISO8859_1
Feld5 VarChar(20) Character Set ISO8859_1
Fled6 VarChar(10) Character Set ISO8859_1

Die 2. Tabelle sieht genau so aus hat jedoch noch ein Feld für ein Datum

In der 1. Tabelle sind die alten Daten und in der 2. Tabelle sind die neuen Daten.

Nun wollte ich in alle Datensätze in der Tabelle2 das aktuelle Datum schreiben, wenn die Datensatz in der Tabelle1 vorhanden ist. Somit müßte der rest ohne Datum dann neu sein oder geändert worden.

Dazu habe ich es zuerst versucht mit einen Update

SQL-Code:
 Update Tabelle2
Set Datumsfeld = '01.08.07'
where Feld1 || Feld2 || Feld3 || Feld4 || Feld5 || Feld6
in (Select Feld1 || Feld2 || Feld3 || Feld4 || Feld5 || Feld6 From Tabelle2)
Das ganze lief zwei Stunden und es hat sich nicht getan. Da habe ich es mal abgebrochen, da es villeicht noch Tage dauern kann bis das Ergebnis vorliegt.

Dann habe ich auf jedes Feld einen Index gesetzt. Einen Index über alle Felder geht ja leider nicht, da er ja zu "breit" ist. Leider

Das ganze mit den Abgleich kann auch genre 10 Stunden dauern nur das Ergebnis sollte stimmen. Also dacht ich mir mach es halt über ein Schleife. Ja mir ist bekannt es ist das schlechteste ist was ich machen kann.
Alle Datensätze der Tabelle 1 hole ich in eiene TIBQuery und mittels einer Schleife suche dann mittels einer TIBQuery den Datensatz in Tabelle2. Wenn das Ergebnis nicht Leer ist setzte ich das Datum. Wenmn ein Feld nicht übereinstimmt wurde etwas geändert. Das ganze geht auch, würde jedoch ca. 123 Stunden dauern und das ist mir etwas zu lange.

Kann mir jemand hier einen Tip geben wie ich es schneller hinbekommen werden. Man die Leute haben wünsche. Sage mir mal den Unterschied bei 800.000 Datensätzen.

Tanja
Tanja
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Datensätze vergleiche

  Alt 1. Aug 2007, 13:03
Der Concat scheint sehr langsam zu sein. Versuchs mal mit dem ausführlichen Statement
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

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

Re: Datensätze vergleiche

  Alt 1. Aug 2007, 13:14
Ich würde es so versuchen (ungetestet):
SQL-Code:
UPDATE Tabelle2 B
SET B.Datumsfeld = '01.08.2007'
WHERE EXISTS(
  SELECT * FROM Tabelle1 A
  WHERE A.Feld1 = B.Feld1
  AND A.Feld2 = B.Feld2
  AND A.Feld3 = B.Feld3
  AND A.Feld4 = B.Feld4
  AND A.Feld5 = B.Feld5
  AND A.Feld6 = B.Feld6)
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
hoika

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

Re: Datensätze vergleiche

  Alt 1. Aug 2007, 13:20
Hallo,

SQL-Code:
Update Tabelle2
Set Datumsfeld = '01.08.07'
where Feld1 || Feld2 || Feld3 || Feld4 || Feld5 || Feld6
in (Select Feld1 || Feld2 || Feld3 || Feld4 || Feld5 || Feld6 From Tabelle2)
Hast du das falsch abgetippt,
es muss doch heissen
in ( XXXFrom Tabelle1)
statt Tabelle2


Nun zum Speed

Ich würde in beide Tabellen ein SumFeld Varchar(XXX) (Summe aller Felder)
eintragen, es per Update füllen
(Update Table1 Set SumFelds = Field1 || Field 2 || ...)

SQL-Code:
Update Tabelle2
Set Datumsfeld = '01.08.07'
where Tabelle2.SumFeld1 not exists in
(Select Tabelle1.SumFeld From Tabelle1
Das Exisst sollte das noch etwas schneller machen.


Heiko
PS: Die beiden SumFeld können danach ja wieder gelöscht werden.
Heiko
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#5

Re: Datensätze vergleiche

  Alt 1. Aug 2007, 14:39
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
  Mit Zitat antworten Zitat
Dumpfbacke

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

Re: Datensätze vergleiche

  Alt 1. Aug 2007, 17:14
Zitat von hoika:
Hallo,


Hast du das falsch abgetippt,
es muss doch heissen
in ( XXXFrom Tabelle1)
statt Tabelle2
Oh ja da habe ich micht vertippelt.

Zitat von hoika:
Nun zum Speed

Ich würde in beide Tabellen ein SumFeld Varchar(XXX) (Summe aller Felder)
eintragen, es per Update füllen
(Update Table1 Set SumFelds = Field1 || Field 2 || ...)
Das habe ich gemacht und es hat nur einige Minuten gedauert.

Zitat von hoika:
SQL-Code:
Update Tabelle2
Set Datumsfeld = '01.08.07'
where Tabelle2.SumFeld1 not exists in
(Select Tabelle1.SumFeld From Tabelle1
Das Exisst sollte das noch etwas schneller machen.
Hier ist nun meine Problem. Ich habe es weiterhin nur in versucht und es dauert und dauert. Ich habe es dann abgebrochen. Das Problem hier ist mein Interbase 6 kann nicht not existis in

Tanja
PS: Die beiden SumFeld können danach ja wieder gelöscht werden.[/quote]
Tanja
  Mit Zitat antworten Zitat
grenzgaenger
(Gast)

n/a Beiträge
 
#7

Re: Datensätze vergleiche

  Alt 1. Aug 2007, 17:24
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
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

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

Re: Datensätze vergleiche

  Alt 1. Aug 2007, 18:24
Hier bietet sich z.B. Beyond Compare an, ein wirklich gutes Tool für diesen Zweck.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
hoika

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

Re: Datensätze vergleiche

  Alt 1. Aug 2007, 21:29
Hallo

argzz

where not exists (select bla)

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


Heiko
Heiko
  Mit Zitat antworten Zitat
beha

Registriert seit: 6. Sep 2006
Ort: Karlsruhe
15 Beiträge
 
Delphi 2006 Enterprise
 
#10

Re: Datensätze vergleiche

  Alt 1. Aug 2007, 22:08
Hallo,

ich möchte nur noch anmerken, dass man mit der zu Beginn erwähnten Concat-Lösung eine Änderung an einem Datensatz evtl. nicht findet, obwohl diese stattgefunden hat. Beispiel:

alter Datensatz: Feld1=ABC Feld2=DEF ...
neuer Datensatz: Feld1=AB Feld2=CDEF ...

hier hat sich was geändert, aber die Änderung würde anhand eines Vergleichs von Feld1 || Feld2 nie festgestellt werden !

Also, falls so was in der Praxis vorkommen kann, kann ein Vergleich mittels || nicht das gewünschte Ergebnis liefern.

beha
Es ist nicht wenig Zeit, die wir haben, sondern
es ist viel Zeit, die wir nicht nutzen.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    


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 05:41 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