571 Stimmen

Wie lösche ich doppelte Zeilen in SQL Server?

Wie kann ich doppelte Zeilen löschen, wenn keine einzigartige Zeilen-ID vorhanden ist?

Meine Tabelle ist

col1  col2 col3 col4 col5 col6 col7
john  1    1    1    1    1    1 
john  1    1    1    1    1    1
sally 2    2    2    2    2    2
sally 2    2    2    2    2    2

Nach dem Entfernen der Duplikate möchte ich folgendes übrig haben:

john  1    1    1    1    1    1
sally 2    2    2    2    2    2

Ich habe schon einige Abfragen ausprobiert, aber ich glaube, sie hängen davon ab, eine Zeilen-ID zu haben, da ich nicht das gewünschte Ergebnis erhalte. Zum Beispiel:

DELETE
FROM table
WHERE col1 IN (
    SELECT id
    FROM table
    GROUP BY id
    HAVING (COUNT(col1) > 1)
)

6voto

oabarca Punkte 10118

Microsoft hat einen sehr ordentlichen Leitfaden zur Entfernung von Duplikaten. Überprüfen Sie http://support.microsoft.com/kb/139444

Kurz gesagt, hier ist der einfachste Weg, Duplikate zu löschen, wenn Sie nur wenige Zeilen löschen müssen:

SET rowcount 1;
DELETE FROM t1 WHERE myprimarykey=1;

myprimarykey ist der Bezeichner für die Zeile.

Ich habe rowcount auf 1 gesetzt, weil ich nur zwei duplizierte Zeilen hatte. Wenn ich 3 duplizierte Zeilen gehabt hätte, hätte ich rowcount auf 2 gesetzt, damit es die ersten beiden löscht, die es sieht, und nur eine in der Tabelle t1 übrig lässt.

6voto

Fezal halai Punkte 663

Probieren Sie es mit:

SELECT linkorder
    ,Row_Number() OVER (
        PARTITION BY linkorder ORDER BY linkorder DESC
        ) AS RowNum
FROM u_links

Bildbeschreibung hier eingeben

4voto

Moshe Taieb Punkte 144

Nachdem ich die oben vorgeschlagene Lösung ausprobiert habe, die für kleine bis mittelgroße Tabellen funktioniert.

  1. Alle Abhängigkeitsansichten der LargeSourceTable löschen

  2. Sie können die Abhängigkeiten mithilfe von SQL Management Studio finden, indem Sie mit der rechten Maustaste auf die Tabelle klicken und "Abhängigkeiten anzeigen" auswählen

  3. Benennen Sie die Tabelle um:

  4. sp_rename 'LargeSourceTable', 'LargeSourceTable_Temp'; GO

  5. Erstellen Sie die LargeSourceTable erneut, fügen Sie jedoch jetzt einen Primärschlüssel mit allen Spalten hinzu, die die Duplikate definieren, und fügen Sie WITH (IGNORE_DUP_KEY = ON) hinzu

  6. Zum Beispiel:

    CREATE TABLE [dbo].[LargeSourceTable] ( ID int IDENTITY(1,1), [CreateDate] DATETIME CONSTRAINT [DF_LargeSourceTable_CreateDate] DEFAULT (getdate()) NOT NULL, [Column1] CHAR (36) NOT NULL, [Column2] NVARCHAR (100) NOT NULL, [Column3] CHAR (36) NOT NULL, PRIMARY KEY (Column1, Column2) WITH (IGNORE_DUP_KEY = ON) ); GO

  7. Erstellen Sie erneut die Ansichten, die Sie zuerst für die neu erstellte Tabelle gelöscht haben

  8. Führen Sie nun das folgende SQL-Skript aus. Sie sehen die Ergebnisse in 1.000.000 Zeilen pro Seite. Sie können die Zeilenanzahl pro Seite ändern, um die Ergebnisse häufiger zu sehen.

  9. Beachten Sie, dass ich das IDENTITY_INSERT ein- und ausschalte, weil eine der Spalten eine automatisch inkrementierbare ID enthält, die ich ebenfalls kopiere

SET IDENTITY_INSERT LargeSourceTable ON DECLARE @PageNumber AS INT, @RowspPage AS INT DECLARE @TotalRows AS INT declare @dt varchar(19) SET @PageNumber = 0 SET @RowspPage = 1000000 select @TotalRows = count (*) from LargeSourceTable_TEMP

While ((@PageNumber - 1) * @RowspPage < @TotalRows )
Begin
    begin transaction tran_inner
        ; with cte as
        (
            SELECT * FROM LargeSourceTable_TEMP ORDER BY ID
            OFFSET ((@PageNumber) * @RowspPage) ROWS
            FETCH NEXT @RowspPage ROWS ONLY
        )

        INSERT INTO LargeSourceTable 
        (
             ID                     
            ,[CreateDate]       
            ,[Column1]   
            ,[Column2] 
            ,[Column3]       
        )       
        select 
             ID                     
            ,[CreateDate]       
            ,[Column1]   
            ,[Column2] 
            ,[Column3]       
        from cte

    commit transaction tran_inner

    PRINT 'Seite: ' + convert(varchar(10), @PageNumber)
    PRINT 'Übertragen: ' + convert(varchar(20), @PageNumber * @RowspPage)
    PRINT 'Von: ' + convert(varchar(20), @TotalRows)

    SELECT @dt = convert(varchar(19), getdate(), 121)
    RAISERROR('Eingefügt am: %s', 0, 1, @dt) WITH NOWAIT
    SET @PageNumber = @PageNumber + 1
End

SET IDENTITY_INSERT LargeSourceTable OFF

4voto

Debendra Dash Punkte 4674
mit meinem CTE
wie

(
Wählen Sie productName,ROW_NUMBER() over(PARTITION BY productName order by slno) as Duplicate aus productDetails
)
Löschen von meinem CTE wo Duplicate>1

2voto

Ankit Jindal Punkte 2562

Dies könnte in Ihrem Fall helfen

DELETE t1 FROM Tabelle t1 INNER JOIN tabelle t2 WHERE t1.id > t2.id AND t1.col1 = t2.col1

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