Eine weitere einfache Lösung finden Sie unter dem eingefügten Link aquí . Diese ist leicht zu verstehen und scheint für die meisten ähnlichen Probleme wirksam zu sein. Es ist zwar für SQL Server, aber das verwendete Konzept ist mehr als akzeptabel.
Hier sind die relevanten Teile der verlinkten Seite:
Beachten Sie diese Daten:
EMPLOYEE_ID ATTENDANCE_DATE
A001 2011-01-01
A001 2011-01-01
A002 2011-01-01
A002 2011-01-01
A002 2011-01-01
A003 2011-01-01
Wie können wir also diese doppelten Daten löschen?
Fügen Sie zunächst eine Identitätsspalte in diese Tabelle ein, indem Sie den folgenden Code verwenden:
ALTER TABLE dbo.ATTENDANCE ADD AUTOID INT IDENTITY(1,1)
Verwenden Sie den folgenden Code, um das Problem zu lösen:
DELETE FROM dbo.ATTENDANCE WHERE AUTOID NOT IN (SELECT MIN(AUTOID) _
FROM dbo.ATTENDANCE GROUP BY EMPLOYEE_ID,ATTENDANCE_DATE)
15 Stimmen
Kleiner Tipp für PostgreSQL-Benutzer, die dies lesen (viele, wenn man bedenkt, wie oft es verlinkt wird): Pg stellt CTE-Terme nicht als aktualisierbare Views zur Verfügung, so dass Sie nicht
DELETE FROM
ein CTE-Begriff direkt. Siehe stackoverflow.com/q/18439054/3986700 Stimmen
@CraigRinger das gleiche gilt für Sybase - Die übrigen Lösungen habe ich hier zusammengestellt (sollten auch für PG und andere gelten): stackoverflow.com/q/19544489/1855801 (ersetzen Sie einfach die
ROWID()
Funktion durch die Spalte RowID, falls vorhanden)14 Stimmen
Ich möchte hier nur einen Vorbehalt anbringen. Wenn Sie einen Deduplizierungsprozess durchführen, überprüfen Sie immer zuerst, was Sie löschen! Dies ist einer der Bereiche, in denen es sehr häufig vorkommt, dass versehentlich gute Daten gelöscht werden.