![]() |
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:
Aber wie macht man das am besten bei mehreren Feldern?
DELETE FROM X WHERE X.Schlüsselfeld in (SELECT Schlüsselfeld FROM Y)
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:
Das geht sogar auch, aber dauert dieses DELETE wieder ewig. Gibt´s ne bessere Lösung?
DELETE FROM X WHERE CSTR(X.Schlüsselfeld1)+'_'+CSTR(X.Schlüsselfeld2) in (SELECT CSTR(X.Schlüsselfeld1)+'_'+CSTR(X.Schlüsselfeld2) from Y)
|
Re: "Überschreiben" einer Datenmenge
Moin,
wenn ich deine Ausführungen richtig verstanden habe, dann hilft dir eine correlated subquery:
SQL-Code:
Grüße vom marabu
DELETE FROM x WHERE EXISTS (SELECT null FROM y WHERE x.a = y.a AND x.b = y.b)
|
Re: "Überschreiben" einer Datenmenge
Wie kommst Du nur immer auf solche Lösungen?
SQL-Code:
wäre mir im Leben nicht eingefallen.
SELECT NULL FROM...
|
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