AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi "Überschreiben" einer Datenmenge
Thema durchsuchen
Ansicht
Themen-Optionen

"Überschreiben" einer Datenmenge

Ein Thema von iGoA · begonnen am 24. Apr 2008 · letzter Beitrag vom 28. Apr 2008
Antwort Antwort
iGoA

Registriert seit: 9. Jul 2007
69 Beiträge
 
#1

"Überschreiben" einer Datenmenge

  Alt 24. Apr 2008, 16:41
Datenbank: MSACCESS • Version: 2003 • Zugriff über: ADO
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?
  Mit Zitat antworten Zitat
marabu

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

Re: "Überschreiben" einer Datenmenge

  Alt 24. Apr 2008, 17:39
Moin,

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

DELETE FROM x WHERE EXISTS (SELECT null FROM y WHERE x.a = y.a AND x.b = y.b) Grüße vom marabu
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

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

Re: "Überschreiben" einer Datenmenge

  Alt 24. Apr 2008, 17:42
Wie kommst Du nur immer auf solche Lösungen? SELECT NULL FROM... wäre mir im Leben nicht eingefallen.
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
iGoA

Registriert seit: 9. Jul 2007
69 Beiträge
 
#4

Re: "Überschreiben" einer Datenmenge

  Alt 28. Apr 2008, 11:21
Krass! Das muss ich mal gleich ausprobieren.

Vielen Dank schonmal!
  Mit Zitat antworten Zitat
Antwort Antwort


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 20:58 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