SQL Mehrfach Datensätze finden und löschen

becks626

Cadet 1st Year
Registriert
Aug. 2012
Beiträge
15
Moin,

ich habe eine Datenbank vorgesetzt bekommen in der es einige Tabellen gibt die keinen PK besitzen.(Wie und warum? Keine Ahnung!)
Ich habe schon fast allen wieder einen PK gegeben, nur 2 Tabellen wollen nicht. Bei den beiden Tabellen bekomme ich eine Fehlermeldung, dass es mehrere Schlüsselwerte gibt und deshalb kein PK erstellt werden kann.

Sooo... Problem:
Eine der beiden Tabellen soll einen zusammengesetzten PK bekommen der aus 6 Schlüsseln besteht. Alle Abfragen die ich bis jetzt im Netz gefunden habe beziehen sich immer (logischerweise) auf Tabellen, die 1. einen PK haben und 2. nur eine Spalte betroffen ist.

Bei mir muss ich doppelte Datensätze in einer Tabelle finden bei denen immer 6 Spalten doppelt sind.
Und dann muss ich jeweils alle bis auf einen (den neusten) Datensatz löschen.

Mit..
Code:
select
    [Column 1],[Column 2],[Column 3],[Column 4],[Column 5],[Column 6]
from
    TableName
group by
    [Column 1],[Column 2],[Column 3],[Column 4],[Column 5],[Column 6]
having
    count(*) > 1
konnte ich zumindest schon einmal heraus finden, wie oft es Duplikate gibt.

Danke schon mal im Voraus für eure Antworten. Ich hoffe meine Frage ist halbwegs verständlich :D

Gruß,
becks626
 
Du solltest am besten auch erwähnen, welches Datenbankmanagementsystem du verwendest.
 
Hallo,
das Problem dass du haben wirst ist dass du keine Duplikate löschen kannst, da die Datenbank die Datensätze in der Ursprungstabelle nicht unterscheiden kann. Eine Delete Statement hilft dir hier nicht weiter

Es gibt es im Prinzip nur einen gangbaren Weg: Einen "select distinct into" in eine neue Tabelle, die alte Tabelle löschen und die Neuerstellte in die alte umbenennen.

Es bietet sich zudem künftig an Primärschlüssel oder Unique Constraints zu verwenden, damit es gar nicht erst zu duplikaten kommt.

greetz
hroessler
 
Zuletzt bearbeitet von einem Moderator:
Du schreibst "bis auf den neuesten" - heißt das, es gibt noch eine Datumsspalte? Du brauchst irgendetwas, um den Datensatz zu identifizieren, der übrig bleiben soll, z.B. eben ein Datum.
Dann tust du ein MAX([Datumsspalte) mit in das Select. Das Ganze verwendest du nun als Unterabfrage und machst einen JOIN von der Tabelle auf deine Unterabfrage. Ins ON kommen deinen ganzen Schlüssel. Dabei nicht vergessen auf [TableName].[Datumsspalte] <> [Unterabfrage].[Datumsspalte] zu filtern, damit du den neuesten Datensatz übrig behältst.

Ca. so:

Code:
select t.[Column 1],t.[Column 2],t.[Column 3],t.[Column 4],t.[Column 5],t.[Column 6], t.[Datumsspalte]
from TableName t
JOIN
(
select
    [Column 1],[Column 2],[Column 3],[Column 4],[Column 5],[Column 6], MAX([Datumsspalte]) 'date'
from
    TableName
group by
    [Column 1],[Column 2],[Column 3],[Column 4],[Column 5],[Column 6]
having
    count(*) > 1
) u
ON u.Column1 = t.Column1 AND u.Column2 = t.Column2 AND u.Column3 = t.Column3 AND u.Column4 = t.Column4 AND u.Column5 = t.Column5 AND u.Column6 = t.Column6 AND u.date <> t.[Datumsspalte]

Wenn du mit dem Ergebnis des SELECTS zufrieden bist, ändere es einfach in ein DELETE.
 
Er hat doch geschrieben, dass die 6 PK Spalten doppelt sind...
 
Zurück
Oben