Da Sie die ID-Spalte als Indikator verwenden, von denen Datensatz ‚Original‘ ist:
delete x
from myTable x
join myTable z on x.subscriberEmail = z.subscriberEmail
where x.id > z.id
So bleibt ein Datensatz pro E-Mail-Adresse.
bearbeiten hinzuzufügen:
die Abfrage oben Um zu erklären, ...
Die Idee hier ist die Tabelle mit sich selbst zu verbinden. Tue so, als hättest du zwei Kopien der Tabelle, die jeweils etwas anderes benannt haben. Dann können Sie sie miteinander vergleichen und die niedrigste ID oder für jede E-Mail-Adresse finden. Sie sehen dann die doppelten Datensätze, die später erstellt wurden, und könnten sie löschen. (Ich visualisierte Excel, wenn ich darüber nachdachte.)
Um diese Operation für eine Tabelle auszuführen, vergleichen Sie sie mit sich selbst und können Sie jede Seite identifizieren, indem Sie Tabellenaliasnamen verwenden. x
ist ein Tabellenalias. Es ist in der from
Klausel wie folgt zugeordnet: from <table> <alias>
. x
kann jetzt an anderer Stelle in derselben Abfrage verwendet werden, um auf diese Tabelle als Verknüpfung zu verweisen.
delete x
startet die Abfrage mit unserer Aktion und Ziel. Wir werden eine Abfrage ausführen, um Datensätze aus mehreren Tabellen auszuwählen, und wir möchten Datensätze löschen, die in x
angezeigt werden.
Aliase werden verwendet, um auf beide "Instanzen" der Tabelle zu verweisen. from myTable x join myTable z on x.subscriberEmail = z.subscriberEmail
bumps den Tisch gegen sich selbst, wo die E-Mails übereinstimmen. Ohne die where-Klausel, die folgt, würde jeder Datensatz so ausgewählt werden, wie er mit sich selbst verbunden werden könnte.
Die Klausel where
begrenzt die ausgewählten Datensätze. where x.id > z.id
ermöglicht die "Instanz" aliased x
enthalten nur die Datensätze, die E-Mails entsprechen, aber einen höheren Wert id
haben. Die Daten, die Sie wirklich in der Tabelle möchten, eindeutige E-Mail-Adressen (mit der niedrigsten ID) sind nicht Bestandteil von x
und werden nicht gelöscht. Die einzigen Datensätze in x
werden doppelte Datensätze (E-Mail-Adressen) sein, die eine höhere id
als der ursprüngliche Datensatz für diese E-Mail-Adresse haben.
Die Join und wo Klauseln in diesem Fall kombiniert werden könnten:
delete x
from myTable x
join myTable z
on x.subscriberEmail = z.subscriberEmail
and x.id > z.id
Dubletten zu verhindern, sollten Sie die subscriberEmail Spalte eine UNIQUE-indizierte Spalte zu machen.
sollten Sie markiere eine Antwort als "akzeptiert" :-) – watery