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

2voto

Mahum Punkte 51

Um doppelte Zeilen in SQL Server zu löschen, wo keine eindeutige Zeilen-ID vorhanden ist, können Sie die ROW_NUMBER() Funktion in Kombination mit einem Common Table Expression (CTE) verwenden, um die doppelten Zeilen zu identifizieren und zu löschen. Hier ist eine Beispielabfrage, die das gewünschte Ergebnis erzielen sollte:

WITH CTE AS (
    SELECT col1, col2, col3, col4, col5, col6, col7,
           ROW_NUMBER() OVER (PARTITION BY col1, col2, col3, col4, col5, col6, col7 ORDER BY (SELECT 0)) AS RowNumber
    FROM YourTable
)
DELETE FROM CTE WHERE RowNumber > 1;

Ersetzen Sie YourTable durch den tatsächlichen Namen Ihrer Tabelle. Diese Abfrage weist jeder Zeile innerhalb jeder Gruppe von doppelten Zeilen basierend auf der Kombination von Werten in col1, col2, col3, col4, col5, col6 und col7 eine Zeilennummer zu. Die Zeilen mit einer Zeilennummer größer als 1 werden dann gelöscht.

Sie können dbForge Studio's SQL-Editor nutzen, um die Abfrage auszuführen und effizient verschiedene andere Aufgaben im Datenbankmanagement zu bearbeiten.

2voto

Hadi Salehy Punkte 240

Sie müssen die Duplikate gemäß des/der Felder aufteilen, dann eines der Datensätze behalten und den Rest löschen. Zum Beispiel:

DELETE prg.Person WHERE Id IN (
SELECT dublicateRow.Id FROM
(
select MIN(Id) MinId, NationalCode
 from  prg.Person group by NationalCode  having count(NationalCode ) > 1
 ) GroupSelect
 JOIN  prg.Person dublicateRow ON dublicateRow.NationalCode = GroupSelect.NationalCode 
 WHERE dublicateRow.Id <> GroupSelect.MinId)

2voto

Emmanuel Bull Punkte 311

Das Löschen von Duplikaten aus einer riesigen (mehrere Millionen Datensätze) Tabelle könnte lange dauern. Ich schlage vor, dass Sie eine Masseneinfügung in eine temporäre Tabelle der ausgewählten Zeilen durchführen, anstatt zu löschen.

--UMSCHREIBUNG IHRES CODES (BEACHTEN SIE DIE 3. LINIE) MIT CTE AS (SELECT NAME, ROW_NUMBER() 
OVER (PARTITION BY NAME ORDER BY NAME) ID FROM @TB) SELECT * INTO #unique_records FROM 
CTE WHERE ID = 1;

2voto

Hasan Shouman Punkte 1722
-- Diese Abfrage behält nur eine Instanz eines Duplikate Datensatzes.
;MIT cte
     AS (SELECT ROW_NUMBER() OVER (PARTITION BY col1, col2, col3-- basierend auf was? -- können mehrere Spalten sein
                                       ORDER BY ( SELECT 0)) RN
         FROM   Mytable)

DELETE  FROM cte
WHERE  RN > 1

1voto

messed-up Punkte 423

Oh wow, ich fühle mich so dumm, wenn ich all diese Antworten lese, sie sind wie die Antworten von Experten mit all dem CTE und temp table und so weiter.

Und alles, was ich gemacht habe, um es zum Laufen zu bringen, war einfach die ID-Spalte zu aggregieren, indem ich MAX verwendet habe.

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

HINWEIS: Möglicherweise müssen Sie es mehrmals ausführen, um Dubletten zu entfernen, da dies jeweils nur einen Satz von doppelten Zeilen löscht.

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