Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi "Überschreiben" einer Datenmenge (https://www.delphipraxis.net/112627-ueberschreiben-einer-datenmenge.html)

iGoA 24. Apr 2008 17:41

Datenbank: MSACCESS • Version: 2003 • Zugriff über: ADO

"Überschreiben" einer Datenmenge
 
Moin!

Ich habe folgende Situation: In eine große Tabelle sollen Daten aus einer kleinen Tabelle eingefügt oder, falls Datensätze mit gleichem Schlüssel schon vorhanden sind, überschrieben werden. Der Primärschlüssel besteht aus 3 Feldern. Ich habe nun ausprobiert vor jedem INSERT ein DELETE (where {Schlüsselfeldinhalte sind gleich}) auszuführen. Das erzielt zwar den gewünschten Effekt, aber durch die Größe der Haupttabelle dauert es ewig (Das DELETE braucht die meiste Zeit). Daher dachte ich nun daran, mit einem einzigen SQL-Befehl alle Datensätze zu löschen, deren Schlüssel in der einzufügenden Menge vorkommen. Also sozusagen "Platz machen", damit ich die Daten anschließend mit einem einzigen INSERT INTO X SELECT FROM Y einfügen kann (was sehr schnell funktioniert, aber eben crashed, wenn Schlüsselwerte doppelt vorkommen). Die Frage ist nur, wie ich dieses DELETE-Statement hinbekomme. Ich muss ja irgendwas in der Art DELETE FROM X WHERE {schlüsselwerte gibt´s in Y auch} ausführen. Bei einem einzigen Feld als Schlüssel würde das ganz einfach mit
SQL-Code:
DELETE FROM X WHERE X.Schlüsselfeld in (SELECT Schlüsselfeld FROM Y)
Aber wie macht man das am besten bei mehreren Feldern?
Ich habe schon probiert, alle Schlüsselfelder in einem Ausdruck zusammenzuführen, damit ich sie per IN abgleichen kann. Also nach dem Muster
SQL-Code:
DELETE FROM X WHERE CSTR(X.Schlüsselfeld1)+'_'+CSTR(X.Schlüsselfeld2) in (SELECT CSTR(X.Schlüsselfeld1)+'_'+CSTR(X.Schlüsselfeld2) from Y)
Das geht sogar auch, aber dauert dieses DELETE wieder ewig. Gibt´s ne bessere Lösung?

marabu 24. Apr 2008 18:39

Re: "Überschreiben" einer Datenmenge
 
Moin,

wenn ich deine Ausführungen richtig verstanden habe, dann hilft dir eine correlated subquery:

SQL-Code:
DELETE FROM x WHERE EXISTS (SELECT null FROM y WHERE x.a = y.a AND x.b = y.b)
Grüße vom marabu

DeddyH 24. Apr 2008 18:42

Re: "Überschreiben" einer Datenmenge
 
Wie kommst Du nur immer auf solche Lösungen?
SQL-Code:
SELECT NULL FROM...
wäre mir im Leben nicht eingefallen.

iGoA 28. Apr 2008 12:21

Re: "Überschreiben" einer Datenmenge
 
Krass! Das muss ich mal gleich ausprobieren.

Vielen Dank schonmal!


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:01 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz