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

18voto

Shoja Hamid Punkte 189
LÖSCHEN von suche
wo id nicht in (
   auswählen min(id) von suche
   gruppieren nach url
   haben zählen(*)=1

   vereinigen

   AUSWÄHLEN min(id) VON suche
   gruppieren nach url
   haben zählen(*) > 1
)

16voto

Mahdi Bashirpour Punkte 13425

Es gibt zwei Lösungen in mysql:

A) Löschen Sie doppelte Zeilen mit dem DELETE JOIN Statement

DELETE t1 FROM contacts t1
INNER JOIN contacts t2 
WHERE 
    t1.id < t2.id AND 
    t1.email = t2.email;

Dieses Query referenziert die Kontakte-Tabelle zweimal, daher verwendet es die Tabellenalias t1 und t2.

Das Ergebnis lautet:

1 Query OK, 4 rows affected (0.10 sec)

Falls Sie die doppelten Zeilen löschen und die niedrigste id behalten wollen, können Sie folgendes Statement verwenden:

DELETE c1 FROM contacts c1
INNER JOIN contacts c2 
WHERE
    c1.id > c2.id AND 
    c1.email = c2.email;

B) Löschen Sie doppelte Zeilen mit einer Zwischentabelle

Die folgenden zeigt die Schritte zum Entfernen von doppelten Zeilen mit einer Zwischentabelle:

    1. Erstellen Sie eine neue Tabelle mit der gleichen Struktur wie die Originaltabelle, von der Sie die doppelten Zeilen löschen wollen.

    2. Fügen Sie eindeutige Zeilen von der Originaltabelle in die Zwischentabelle ein.

    3. Fügen Sie eindeutige Zeilen von der Originaltabelle in die Zwischentabelle ein.

Schritt 1. Erstellen Sie eine neue Tabelle, deren Struktur der Originaltabelle entspricht:

CREATE TABLE source_copy LIKE source;

Schritt 2. Fügen Sie eindeutige Zeilen von der Originaltabelle in die neue Tabelle ein:

INSERT INTO source_copy
SELECT * FROM source
GROUP BY col; -- Spalte, die doppelte Werte hat

Schritt 3. Löschen Sie die Originaltabelle und benennen Sie die Zwischentabelle in die Originaltabelle um

DROP TABLE source;
ALTER TABLE source_copy RENAME TO source;

Quelle: http://www.mysqltutorial.org/mysql-delete-duplicate-rows/

11voto

Jithin Shaji Punkte 5453

Bitte beachten Sie auch die folgende Löschmethode.

Declare @table table
(col1 varchar(10),col2 int,col3 int, col4 int, col5 int, col6 int, col7 int)
Insert into @table values 
('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)

Erstellen Sie eine Beispieltabelle mit dem Namen @table und laden Sie sie mit den angegebenen Daten.

Bildbeschreibung hier eingeben

Löschen Sie aliasName aus (
Select  *,
        ROW_NUMBER() over (Partition by col1,col2,col3,col4,col5,col6,col7 order by col1) as rowNumber
From    @table) aliasName 
Where   rowNumber > 1

Select * from @table

Bildbeschreibung hier eingeben

Hinweis: Wenn Sie alle Spalten im Partition by Teil angeben, hat die Anweisung order by nicht viel Bedeutung.

Ich weiß, die Frage wurde vor drei Jahren gestellt, und meine Antwort ist eine andere Version von dem, was Tim gepostet hat, aber ich poste es nur für den Fall, dass es für jemanden hilfreich ist.

10voto

San Jaisy Punkte 11971

Um die doppelten Zeilen aus der Tabelle in SQL Server zu löschen, befolgen Sie diese Schritte:

  1. Suchen Sie doppelte Zeilen mithilfe der GROUP BY-Klausel oder der ROW_NUMBER() -Funktion.
  2. Verwenden Sie die DELETE-Anweisung, um die doppelten Zeilen zu entfernen.

Ein Beispiel einer Tabelle einrichten

DROP TABLE IF EXISTS Kontakt;

CREATE TABLE Kontakt(
    Kontakt_id INT IDENTITY(1,1) PRIMARY KEY,
    vorname NVARCHAR(100) NOT NULL,
    nachname NVARCHAR(100) NOT NULL,
    E-Mail NVARCHAR(255) NOT NULL,
);

Werte einfügen

INSERT INTO Kontakt
    (vorname,nachname,E-Mail) 
VALUES
    ('Syed','Abbas','syed.abbas@example.com'),
    ('Catherine','Abel','catherine.abel@example.com'),
    ('Kim','Abercrombie','kim.abercrombie@example.com'),
    ('Kim','Abercrombie','kim.abercrombie@example.com'),
    ('Kim','Abercrombie','kim.abercrombie@example.com'),
    ('Hazem','Abolrous','hazem.abolrous@example.com'),
    ('Hazem','Abolrous','hazem.abolrous@example.com'),
    ('Humberto','Acevedo','humberto.acevedo@example.com'),
    ('Humberto','Acevedo','humberto.acevedo@example.com'),
    ('Pilar','Ackerman','pilar.ackerman@example.com');

Bildbeschreibung eingeben

Abfrage

    SELECT 
   Kontakt_id, 
   vorname, 
   nachname, 
   E-Mail
FROM 
   Kontakt;

Doppelte Zeilen aus einer Tabelle löschen

   WITH cte AS (
    SELECT 
        Kontakt_id, 
        vorname, 
        nachname, 
        E-Mail, 
        ROW_NUMBER() OVER (
            PARTITION BY 
                vorname, 
                nachname, 
                E-Mail
            ORDER BY 
                vorname, 
                nachname, 
                E-Mail
        ) row_num
     FROM 
        Kontakt
)
DELETE FROM cte
WHERE row_num > 1;

Sollte den Datensatz jetzt löschen

Bildbeschreibung eingeben

9voto

Es kann auf verschiedene Arten in SQL Server gemacht werden Die einfachste Möglichkeit besteht darin: Fügen Sie die eindeutigen Zeilen aus der Tabelle mit doppelten Zeilen in eine neue temporäre Tabelle ein. Löschen Sie dann alle Daten aus der Tabelle mit doppelten Zeilen und fügen Sie alle Daten aus der temporären Tabelle ein, die keine Duplikate enthält, wie unten gezeigt.

select distinct * into #tmp From table
   delete from table
   insert into table
   select * from #tmp drop table #tmp

   select * from table

Löschen von Duplikaten mithilfe von Common Table Expression (CTE)

With CTE_Duplicates as 
(select id,name , row_number() 
over(partition by id,name order by id,name ) rownumber  from table  ) 
delete from CTE_Duplicates where rownumber!=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