PDA

Vollständige Version anzeigen : Duplikate entfernen


marchelle
27.03.2006, 08:36
Hallo zusammen,
ich habe das Forum zu diesem Thema sehr ausführlich durchsucht und bin aber trotzdem leider zu keinem Ergebnis gekommen. Ich habe folgendes Problem:
Ich habe ein oder mehrer Duplikate in einer Tabelle was auch in erster Linie so sein soll. Jetzt möchte ich das keine Duplikate mehr vorhanden sind. Mit diesem code suche ich mir die Duplikate herraus:

select PrimaryKey
FROM tbl_Tagespauschalen As Tmp
GROUP BY PrimaryKey HAVING Count(*)>1

PrimaryKey ist kein Primärschlüssel! Das Feld setzt sich aus drei anderen Feldern zusammen.
Wie kann ich den Code jetzt umbauen, sodass er mir die Duplikate nicht nur anzeigt sondern auch löscht und zwar nur das Duplikat. Schon mal vielen Dank für eure Hilfe!

Nouba
27.03.2006, 09:16
Du brauchst dazu zumindest noch ein Feld, wonach eindeutig bestimmt werden kann, welcher Datensatz erhalten bleinen soll, wenn das Vorhaben mittels Löschabfrage gestaltet werden soll - ansonsten wäre prozedurales Herangehen mittels VBA angesagt.

Ist z. Bsp ein eindeutiges Erstellungsdatum gegeben und es soll der jüngste Datensatz bestehen bleiben, wäre diese Konstruktion denkbar.
DELETE * FROM tbl_Tagespauschalen AS P
WHERE P.ERSTELLT < (
SELECT
Max(T.ERSTELLT)
FROM tbl_Tagespauschalen AS T
WHERE T.DUBLETTENFELD = P.DUBLETTENFELD)

Thomas Gasche
27.03.2006, 09:24
Hallo,
zuerst einmal ein paar Umbenennungen, um Verwirrung zu vermeiden:
[PK] ist der "echte" PrimaryKey Deiner Tabelle.
[Feld1] - [Feld3] sind Deine Gruppierungsfelder.
Es gibt hier mehrere Lösungswege, hier die mE übersichtlichste (aber nicht die schnellste)
Vorgehensweise:
Baue ein Recordset auf, welches Dir die mehrfach vorkommenden Gruppierungsfelder auflistet (Syntax wie von Dir gepostet).
Solange es noch Duplikate gibt (WHILE-Schleife) tust Du dann folgendes:
1. Ermittle Dir den [PK] des Satzes den Du behalten willst (z.B. den kleinsten [PK]) - z.B. über das Domänenaggregat (DMIN)
2. Lösche dann alle anderen Sätze mit [PK] <> ermittelter [PK] und [Feld1]-[Feld3] = [ermittelte Werte aus der Duplikate-Abfrage].

Code hierzu:
RST_Duplikate = currentDB.OpenRecordset("select [Feld1],[Feld2],[Feld3] FROM tbl_Tagespauschalen
GROUP BY [Feld1],[Feld2],[Feld3] HAVING Count(*)>1")
While RST_Duplikate.EOF = false
MinPK = DMIN("PK","tbl_Tagespauschalen","[Feld1] = " & RST_Duplikate.Feld1 & " AND [Feld2] = " & RST_Duplikate.Feld2 & " AND [Feld3] = & RST_Duplikate.Feld3)
STR_SQL = "DELETE FROM tbl_Tagespauschalen WHERE [Feld1] = " & RST_Duplikate.Feld1 & " AND [Feld2] = " & RST_Duplikate.Feld2 & " AND [Feld3] = & RST_Duplikate.Feld3 & " AND [PK]<> " & minPK
currentDB.execute str_sql
RST_Duplikate.MoveNext
Wend
RST_Duplikate.close
set RST_Duplikate = nothing

Schneller geht es, wenn Du den zu behaltenden [PK] mit einem Sub-Select ermittelst.
ACHTUNG: Das Beispiel funktioniert so nur mit numerischen Feldern, für Strings, Datumswerten, etc. müssen die WHERE-Bedingungen angepasst werden (Bei String zB. den Wert in einfache Hochkommata setzen, Datumeswerte in SQL-Datum umwandeln, etc....

marchelle
27.03.2006, 09:54
Hallo ihr Beiden und erstmal Danke für die schnelle Antwort.
@nouba leider gibt es kein Erstellungsdatum oder ähnliches. Ich habe jetzt in die Tabelle einen PK gesetzt mit autowert und dann diesen code umgeändert:

delete
FROM tbl_Tagespauschalen AS P
WHERE P.PK < (
SELECT
Max(T.PK)
FROM tbl_Tagespauschalen AS T
WHERE T.PrimaryKey = P.PrimaryKey)

Das ganze passiert bei mir auf dem Enterprise Manager in Verbindung mit SQL-Server und er sagt mir jetzt diese Fehlermeldung:

Server: Nachr.-Nr. 156, Schweregrad 15, Status 1, Zeile 2
Incorrect syntax near the keyword 'AS'.

Zeile 2 ist die wo das erste AS vorkommt. Wenn ich das ganze mit Select ausführe funktioniert es aber mit delete leider nicht:( Hast du eine Idee?

Thomas Gasche
27.03.2006, 10:00
Hallo,
im DELETE kannst Du keinen Alias setzen (AS) - das funktioniert nur im SELECT.
Also - Vergiss das AS P und ersetze "P." durch "tbl_tagespauschalen." - dann sollte es gehen.

Markus Stech
27.03.2006, 10:06
@ marchelle

Der Befehl "delete" kennt kein "AS"!

Gruß

Markus

marchelle
27.03.2006, 10:12
Hi Thomas,
vielen Dank das hat funktioniert!!! Wenn ich dort noch ein Problem habe melde ich mich nochmal ok?. DANKE!

JPA
20.04.2007, 20:07
Hier wahrscheinlich eine Lösung für dich:
http://ms-office-forum.net/forum/showthread.php?t=208417