SQL Delete

04/05/2010 - 18:35 von Nicole Wagner | Report spam
Hallo User,

ich habe wieder mal ein SQL Problem, das moeglicherweise fuer einen
Geuebteren nur ein Klack ist. (Firebird 2.1.)

Ich will sagen:

1) finde alle Datensaetze in Tabelle1 mit gleichem FK
2) ordne diese Datensaetze nach dem Datumsfeld
3) behalte die letzten 90 Saetze (Enddatum liegt in der Vergangenheit,
nicht auf now)
4) lösche die aelteren Saetze

Meine Schwierigkeit bei Punkt 1 ist "ALLE".
D.h. ich will den FK nicht haendisch eingeben, sondern SQL soll die
Gruppierung durchfuehren. Es sind rund 10.000 FKs.

Mein zweites Problem ist bei Punkt 3, dass ich nur weiss, was genau ich
behalten will. Aber nicht genau, was geloescht werden soll.

Der Ueberdrueber-Trick bei 1 waere natuerlich ein Join.

Also z.B.:
loesche alle "alten" Datensaetze in Tabelle1 mit gleichem FK, wobei der
FK ein PK in der Tabelle2 ist, wo das Feld tabelle2.Feldxy den Wert z
hat.


Danke fuer Tipps!

Nicole
 

Lesen sie die antworten

#1 Torge Ismer
05/05/2010 - 09:38 | Warnen spam
Hallo,

1) finde alle Datensaetze in Tabelle1 mit gleichem FK
2) ordne diese Datensaetze nach dem Datumsfeld
3) behalte die letzten 90 Saetze (Enddatum liegt in der Vergangenheit,
nicht auf now)
4) lösche die aelteren Saetze



Das ist so direkt in SQL nicht möglich. Ich sehe hier zwei Lösungsansàtze.

Lösung A
Lese sàmtliche relevanten Daten ein und sortiere sie in der ersten Ebene
nach FK, in der zweiten nach dem Datum.
SELECT PK, FK, Datum FROM Tab1 ORDER BY FK, Datum DESC
Damit hàttest du dann wirklich "Alle" erfaßt.

Die so gelieferten Daten gehst du in einer Prozedur Stück für Stück durch
und merkst dir die PK für den 91. und fortfolgende Datensàtze für den
jeweiligen FK. Immer wenn der FK wechselt, überspringst du wieder die ersten
90.

In einem zweiten Schritt löscht du die gemerkten PK.
DELETE FROM Tab1 WHERE PK IN (...)

Lösung B
Lese im ersten Schritt die gruppierten FK ein.
SELECT FK FROM Tab1 GROUP BY FK

Dann führst du im Prinzip Lösung A für jeden FK aus.
Daten einlesen: SELECT PK FROM Tab1 WHERE FK = ... ORDER BY Datum DESC
Datensatz 91 bis ... merken, löschen.


Nach meiner Erfahrung sind mehrfache, gestaffelte Datenbankzugriffe deutlich
langsamer als ein großer Zugriff und eine interne Weiterverarbeitung. Ich
empfehle daher Lösung A.

Der Ueberdrueber-Trick bei 1 waere natuerlich ein Join.


Nein, ein Join kombiniert Daten mehrer Tabellen. Bei einer Tabelle fàllt mir
für Join kein sinnhaftes Beispiel ein.

Grüße
Torge

Ähnliche fragen