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)
)

1voto

j.hull Punkte 282

Wenn Sie die Möglichkeit haben, vorübergehend eine Spalte zur Tabelle hinzuzufügen, war dies eine Lösung, die für mich funktioniert hat:

ALTER TABLE dbo.DUPPEDTABLE ADD RowID INT NOT NULL IDENTITY(1,1)

Führen Sie dann ein DELETE unter Verwendung einer Kombination von MIN und GROUP BY durch

DELETE b
FROM dbo.DUPPEDTABLE b
WHERE b.RowID NOT IN (
                     SELECT MIN(RowID) AS RowID
                     FROM dbo.DUPPEDTABLE a WITH (NOLOCK)
                     GROUP BY a.ITEM_NUMBER,
                              a.CHARACTERISTIC,
                              a.INTVALUE,
                              a.FLOATVALUE,
                              a.STRINGVALUE
                 );

Überprüfen Sie, ob das DELETE korrekt durchgeführt wurde:

SELECT a.ITEM_NUMBER,
    a.CHARACTERISTIC,
    a.INTVALUE,
    a.FLOATVALUE,
    a.STRINGVALUE, COUNT(*)--MIN(RowID) AS RowID
FROM dbo.DUPPEDTABLE a WITH (NOLOCK)
GROUP BY a.ITEM_NUMBER,
    a.CHARACTERISTIC,
    a.INTVALUE,
    a.FLOATVALUE,
    a.STRINGVALUE
ORDER BY COUNT(*) DESC 

Das Ergebnis sollte keine Zeilen mit einer Anzahl größer als 1 enthalten. Entfernen Sie abschließend die RowID-Spalte:

ALTER TABLE dbo.DUPPEDTABLE DROP COLUMN RowID;

1voto

rajibdotnet Punkte 1396

Mit Bezug auf https://support.microsoft.com/de-de/help/139444/how-to-remove-duplicate-rows-from-a-table-in-sql-server

Die Idee, Duplikate zu entfernen, beinhaltet

  • a) Schutz der Zeilen, die keine Duplikate sind
  • b) Beibehaltung einer der vielen Zeilen, die zusammen als Duplikate qualifizieren.

Schritt-für-Schritt

  • 1) Identifizieren Sie zuerst die Zeilen, die die Definition von Duplikaten erfüllen, und fügen Sie sie in eine temporäre Tabelle ein, sagen wir #tableAll.
  • 2) Wählen Sie Nicht-Duplikate (einzelne Zeilen) oder eindeutige Zeilen in eine temporäre Tabelle ein, sagen wir #tableUnique.
  • 3) Löschen Sie aus der Quelltabelle durch Verknüpfung von #tableAll, um die Duplikate zu löschen.
  • 4) Fügen Sie in die Quelltabelle alle Zeilen aus #tableUnique ein.
  • 5) Löschen Sie #tableAll und #tableUnique

1voto

Richard Valenz Punkte 71

Bitte fügen Sie einfach das Schlüsselwort DISTINCT direkt nach dem SELECT-Befehl hinzu, zum Beispiel:

SELECT DISTICNT ColumnOne, ColumnTwo, ColumnThree
 FROM YourTable

0voto

Surinder Singh Punkte 161
DECLARE @TB TABELLE(NAME VARCHAR(100));
INSERT INTO @TB WERTE ('Rot'),('Rot'),('Grün'),('Blau'),('Weiß'),('Weiß')
--**Nach Rang löschen**
;MIT CTE ALS(SELECT NAME,DENSE_RANK() OVER (PARTITION BY NAME ORDER BY NEWID()) ID FROM @TB)
DELETE FROM CTE WO ID>1
SELECT NAME FROM @TB;
--**Nach Zeilennummer löschen**
;MIT CTE ALS(SELECT NAME,ZEILENNUMMER() OVER (PARTITION BY NAME ORDER BY NAME) ID FROM @TB)
DELETE FROM CTE WO ID>1;
SELECT NAME FROM @TB;

0voto

Dr.Stark Punkte 106
DELETE FROM TBL1  WHERE ID  IN
(SELECT ID FROM TBL1  a WHERE ID!=
(select MAX(ID) from TBL1  where DUPVAL=a.DUPVAL 
group by DUPVAL
having count(DUPVAL)>1))

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