Puisque vous utilisez la colonne id comme un indicateur dont dossier est « original »:
delete x
from myTable x
join myTable z on x.subscriberEmail = z.subscriberEmail
where x.id > z.id
Cela laissera un enregistrement par adresse e-mail.
modifier pour ajouter:
Pour expliquer la requête ci-dessus ...
L'idée est ici pour se joindre à la table contre elle-même. Imaginez que vous avez deux copies de la table, chacune nommée quelque chose de différent. Ensuite, vous pouvez les comparer les uns aux autres et trouver l'identifiant le plus bas ou pour chaque adresse e-mail. Vous verriez alors les enregistrements en double qui ont été créés plus tard et pourraient les supprimer. (Je visualisais Excel en y réfléchissant.)
Pour effectuer cette opération sur une table, la comparer à elle-même et être capable d'identifier chaque côté, vous utilisez des alias de table. x
est un alias de table. Il est affecté dans la clause from
comme suit: from <table> <alias>
. x
peut maintenant être utilisé ailleurs dans la même requête pour faire référence à cette table en tant que raccourci. Lance la requête avec notre action et notre cible.
delete x
Nous allons effectuer une requête pour sélectionner les enregistrements de plusieurs tables, et nous voulons supprimer les enregistrements qui apparaissent dans x
.
Les alias sont utilisés pour désigner les deux 'instances' de la table. from myTable x join myTable z on x.subscriberEmail = z.subscriberEmail
heurte la table contre lui-même où les e-mails correspondent. Sans la clause where qui suit, chaque enregistrement serait sélectionné car il pourrait être joint contre lui-même.
La clause where
limite les enregistrements sélectionnés. where x.id > z.id
permet à l'instance 'alias' x
de contenir uniquement les enregistrements qui correspondent à des e-mails mais qui ont une valeur id
supérieure. Les données que vous voulez vraiment dans le tableau, les adresses e-mail uniques (avec l'ID le plus bas) ne feront pas partie de x
et ne seront pas supprimées. Les seuls enregistrements dans x
seront des enregistrements en double (adresses e-mail) qui ont un id
supérieur à l'enregistrement d'origine pour cette adresse e-mail.
join et où les clauses pourraient être combinées dans ce cas:
delete x
from myTable x
join myTable z
on x.subscriberEmail = z.subscriberEmail
and x.id > z.id
Pour prévenir les doublons, pensez à faire la colonne subscriberEmail une colonne indexée UNIQUE.
Vous devriez marquer une réponse comme "accepté" :-) – watery