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
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
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?