Ich dachte, ich teile meine Lösung mit, da sie unter besonderen Umständen funktioniert. In meinem Fall hatte die Tabelle mit den doppelten Werten keinen Fremdschlüssel (weil die Werte aus einer anderen Datenbank dupliziert wurden).
begin transaction
-- create temp table with identical structure as source table
Select * Into #temp From tableName Where 1 = 2
-- insert distinct values into temp
insert into #temp
select distinct *
from tableName
-- delete from source
delete from tableName
-- insert into source from temp
insert into tableName
select *
from #temp
rollback transaction
-- if this works, change rollback to commit and execute again to keep you changes!!
PS: Wenn ich an solchen Dingen arbeite, verwende ich immer eine Transaktion, die nicht nur sicherstellt, dass alles als Ganzes ausgeführt wird, sondern mir auch erlaubt, zu testen, ohne etwas zu riskieren. Aber natürlich sollte man trotzdem ein Backup machen, nur um sicher zu gehen...
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.