Wenn man doppelte Datensätze in einer Tabelle finden und eliminieren möchte, ist das manuell zwar möglich, es wird aber ab einer gewissen Anzahl von Datensätzen nicht mehr sinnvoll möglich sein. Zum Glück gibt es SQL und dabei speziell den HAVING-Operator. Dieser ermöglicht uns, eine Datenbankabfrage zu starten und danach das Ergebnis zu bearbeiten. Man kann sich also zum Beispiel Umsatzwerte aus geben lassen und mit HAVING nur die, die sehr niedrig oder sehr hoch sind.
Oder, um auf die eigentliche Aufgabe zurück zu kommen, kann man damit auch doppelte Datensätze finden und löschen. Der Einfachheit halber gehen wir trotzdem davon aus, dass es eine ID-Spalte gibt, die aber teilweise doppelt vergeben wurde.
-- Damit wir sehen, wie viel Zeilen wir eingespart haben
DECLARE @count as INT
SELECT @count = COUNT(*) FROM quell_tabelle
-- Wir nehmen alle Zeilen, die bei einem GROUP BY
-- Mehr als einmal vorkommen (HAVING count(*) > 1).
-- Diese werden in eine temporäre Tabelle gespeichert
SELECT id, spalte1, spalte2, spalte3, zaehler = count(*)
INTO #temp_tabelle
FROM quell_tabelle
GROUP BY id, spalte1, spalte2, spalte3
HAVING count(*) > 1
-- Es werden alle Zeilen aus der ursprünglichen Tabelle gelöscht, die auch in
-- der temporären Tabelle, jetzt aber nur einmal, gelöscht.
DELETE FROM quell_tabelle
WHERE ID IN(
SELECT ID FROM #temp_tabelle)
-- Jetzt müssen wir noch die Daten aus der temporären
-- in die richtige Tabelle zurück schreiben
INSERT INTO quell_tabelle
SELECT id, spalte1, spalte2, spalte3
FROM #temp_tabelle
-- die temporäre Tabelle können wir jetzt löschen
DROP TABLE #temp_tabelle
SELECT @count - COUNT(*) as Anzahl_geloeschter_Datensaetze
FROM quell_tabelle