Heim > Datenbank > MySQL-Tutorial > Wie lösche ich effizient doppelte Zeilen aus einer Tabelle in SQL?

Wie lösche ich effizient doppelte Zeilen aus einer Tabelle in SQL?

Mary-Kate Olsen
Freigeben: 2025-01-19 02:47:08
Original
115 Leute haben es durchsucht

How to Efficiently Delete Duplicate Rows from a Table in SQL?

SQL: Eliminieren doppelter Zeilen in Tabellen

Herausforderung:

Sie stehen vor einer Tabelle ohne Primärschlüssel oder Einschränkungen, die mehrere Zeilen mit identischen Daten enthält. Das Ziel besteht darin, doppelte Zeilen zu entfernen und nur eine einzige Instanz jeder eindeutigen Zeile zu erhalten. Wir verwenden eine Spalte mit dem Namen „Schlüssel“, um Duplikate zu identifizieren und sicherzustellen, dass für jeden eindeutigen „Schlüssel“-Wert nur ein Eintrag vorhanden ist.

Lösung:

Dieser Prozess umfasst zwei wichtige Schritte:

  1. Identifizieren des ersten Vorkommens:Suchen Sie die erste Instanz jeder doppelten Zeile.
  2. Entfernen nachfolgender Duplikate:Löschen Sie alle Zeilen, die nicht das erste in Schritt 1 identifizierte Vorkommen sind.

Der folgende SQL-Befehl erreicht dies:

<code class="language-sql">DELETE FROM dups a USING (
    SELECT MIN(ctid) as ctid, key
    FROM dups 
    GROUP BY key HAVING COUNT(*) > 1
) b
WHERE a.key = b.key 
AND a.ctid <> b.ctid;</code>
Nach dem Login kopieren

Wichtiger Hinweis: Diese Methode bietet keine Kontrolle darüber, welche bestimmte Zeile beibehalten wird.

Anschauliches Beispiel:

Betrachten Sie diese Beispieltabelle:

<code class="language-sql">CREATE TABLE people (
    name    varchar(50) NOT NULL,
    surname varchar(50) NOT NULL,
    age     integer NOT NULL
);

INSERT INTO people (name, surname, age) VALUES 
    ('A.', 'Tom', 30),
    ('A.', 'Tom', 10),
    ('B.', 'Tom', 20),
    ('B', 'Chris', 20);</code>
Nach dem Login kopieren

So finden Sie das erste Vorkommen von Duplikaten:

<code class="language-sql">SELECT MIN(ctid) as ctid, name, surname
FROM people 
GROUP BY (name, surname) HAVING COUNT(*) > 1;</code>
Nach dem Login kopieren

Ausgabe:

ctid name surname
(0,1) A. Tom

Löschen der nicht-ersten Duplikate:

<code class="language-sql">DELETE FROM people a USING (
    SELECT MIN(ctid) as ctid, name, surname
    FROM people 
    GROUP BY (name, surname) HAVING COUNT(*) > 1
) b
WHERE a.name = b.name
AND a.surname = b.surname
AND a.ctid <> b.ctid;</code>
Nach dem Login kopieren

Die restlichen Zeilen:

<code class="language-sql">SELECT * FROM people;</code>
Nach dem Login kopieren

Ausgabe:

name surname age
A. Tom 30
B. Tom 20
B Chris 20

Das obige ist der detaillierte Inhalt vonWie lösche ich effizient doppelte Zeilen aus einer Tabelle in SQL?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage