1375 Stimmen

Wie kann ich doppelte Zeilen entfernen?

Wie entfernt man am besten doppelte Zeilen aus einer ziemlich großen SQL Server Tabelle (d.h. 300.000+ Zeilen)?

Die Zeilen werden natürlich keine perfekten Duplikate sein, da es die RowID Identitätsfeld.

MyTable

RowID int not null identity(1,1) primary key,
Col1 varchar(20) not null,
Col2 varchar(2048) not null,
Col3 tinyint not null

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/398670

0 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.

47voto

Jithin Shaji Punkte 5453
DELETE LU 
FROM   (SELECT *, 
               Row_number() 
                 OVER ( 
                   partition BY col1, col1, col3 
                   ORDER BY rowid DESC) [Row] 
        FROM   mytable) LU 
WHERE  [row] > 1

1 Stimmen

Ich erhalte diese Meldung auf Azure SQL DW: Eine FROM-Klausel wird derzeit in einer DELETE-Anweisung nicht unterstützt.

42voto

Syed Mohamed Punkte 1301

Dadurch werden doppelte Zeilen gelöscht, außer der ersten Zeile.

DELETE
FROM
    Mytable
WHERE
    RowID NOT IN (
        SELECT
            MIN(RowID)
        FROM
            Mytable
        GROUP BY
            Col1,
            Col2,
            Col3
    )

Siehe ( http://www.codeproject.com/Articles/157977/Remove-Duplicate-Rows-from-a-Table-in-SQL-Server )

11 Stimmen

Bei mysql wird ein Fehler angezeigt: Fehlercode: 1093. Sie können die Zieltabelle 'Mytable' für die Aktualisierung in der FROM-Klausel nicht angeben, aber diese kleine Änderung wird für mysql funktionieren: DELETE FROM Mytable WHERE RowID NOT IN ( SELECT ID FROM (SELECT MIN(RowID) AS ID FROM Mytable GROUP BY Col1,Col2,Col3) AS TEMP)

37voto

Shamseer K Punkte 4434

Ich würde CTE für das Löschen von doppelten Zeilen aus Sql Server Tabelle bevorzugen

empfehlen wir dringend, diesen Artikel zu lesen:: http://codaffection.com/sql-server-article/delete-duplicate-rows-in-sql-server/

durch Beibehaltung der ursprünglichen

WITH CTE AS
(
SELECT *,ROW_NUMBER() OVER (PARTITION BY col1,col2,col3 ORDER BY col1,col2,col3) AS RN
FROM MyTable
)

DELETE FROM CTE WHERE RN<>1

ohne das Original zu behalten

WITH CTE AS
(SELECT *,R=RANK() OVER (ORDER BY col1,col2,col3)
FROM MyTable)
 
DELETE CTE
WHERE R IN (SELECT R FROM CTE GROUP BY R HAVING COUNT(*)>1)

0 Stimmen

In einer Abfrage verwenden Sie 'from' nach dem Löschen und in einer anderen ist 'from' nicht vorhanden, was ist das, ich bin verwirrt?

30voto

Shaini Sinha Punkte 487

Um doppelte Zeilen zu holen:

SELECT
name, email, COUNT(*)
FROM 
users
GROUP BY
name, email
HAVING COUNT(*) > 1

So löschen Sie die doppelten Zeilen:

DELETE users 
WHERE rowid NOT IN 
(SELECT MIN(rowid)
FROM users
GROUP BY name, email);

0 Stimmen

Für MySQL-Benutzer ist zu beachten, dass es sich zunächst um eine DELETE FROM Zweitens: Es wird nicht funktionieren, weil man nicht SELECT aus derselben Tabelle, die Sie DELETE aus. In MySQL sprengt das die MySQL error 1093 .

0 Stimmen

Ich denke, das ist viel vernünftiger als die eher esotherisch anmutende Antwort mit DELETE FROM ... LEFT OUTER JOIN die auch auf einigen Systemen (z. B. SQL Server) nicht funktioniert. Wenn Sie auf die oben genannte Einschränkung stoßen, können Sie die Ergebnisse Ihrer Auswahl immer in einer temporären TABLE-Variablen speichern: DECLARE @idsToKeep TABLE(rowid INT); y luego INSERT INTO @idsToKeep(rowid) SELECT MIN... GROUP BY ... しかるのち DELETE users WHERE rowid NOT IN (SELECT rowid FROM @idsToKeep);

24voto

JuanJo Punkte 265

Quick and Dirty, um exakt duplizierte Zeilen zu löschen (für kleine Tabellen):

select  distinct * into t2 from t1;
delete from t1;
insert into t1 select *  from t2;
drop table t2;

3 Stimmen

Beachten Sie, dass die Frage eigentlich eine nicht exakte Vervielfältigung (dueto row id) vorsieht.

0 Stimmen

Sie müssen auch mit Identitätsspalten (Schlüssel) umgehen, indem Sie set identity_insert t1 on .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X