PDA

View Full Version : Per SQL doppelte Sätze entfernen



USDAVIS
02-03-09, 09:30
Moin, moin.

Aus einer Datei sollen per SQL doppelte Sätze entfernt werden und zwar in Abhängigkeit eines Datums. Der Satz mit dem jüngsten Datum soll in der Datei verbleiben.

Etwa so:

delete from datei a
where
a.kunde in
(select b.kunde from datei b
group by b.kunde
having count(*) > 1)
and
a.datum <
(select max(c.datum) from datei c
where c.kunde = a.kunde)

Das Problem ist jedoch das Vorkommen von Sätzen, bei denen ein Kunde zwei Sätze mit gleichem Datum hat.

z. B.
0815 2009-01-23
0815 2009-01-23
0816 2009-02-01
0816 2008-12-31
0816 2007-12-31

In diesem Fall würde zwar Kunde 0816 korrekt gelöscht, d.h., nur der Satz aus 2009 bleibt bestehen. Kunde 0815 bleibt aber mit 2 Sätze in der Datei, weil meine Abfrage < Max(Datum) lautet. Ändere ich die Abfrage auf <= Max(Datum) werden aber fälschlicherweise beide Sätze von Kunde 0815 gelöscht.

Im Moment habe ich da ein grosses Brett vor dem Kopf und bitte um Anregungen, wie man dieses Problem lösen kann. Das Ganze müsste dann auch noch (bitte nicht lachen) unter V4R3 laufen.

Danke und Gruss
Ulli

B.Hauser
02-03-09, 10:26
In Ermangelung eines anderen Kriteriums kannst Du nur noch die relative Satz-Nr. prüfen und nur den Satz mit der höchsten relativen Satz-Nr. stehen lassen:

Etwa so:

delete from Datei a
where a.kunde in (select b.kunde from Datei b
group by b.kunde
having count(*) > 1)
and rrn(a) < (select Max(RRN (c)) from Datei c
where c.kunde = a.kunde
and c.Datum = (Select Max(Datum)
from Datei d
where c.Kunde = d.Kunde))

Birgitta

USDAVIS
02-03-09, 11:01
Danke Birgitta !!!

Mit der RRN kann ich 'was anfangen.

Gruss
Ulli

Fuerchau
02-03-09, 12:43
Denke aber daran, wenn du REUSEDLT(*YES) hast, dass die RRN nicht den aktuellsten Satz bezeichnen muss.