Dal momento che si sta utilizzando la colonna id come un indicatore di cui record è 'originale':
delete x
from myTable x
join myTable z on x.subscriberEmail = z.subscriberEmail
where x.id > z.id
Questo lascerà un record per l'indirizzo e-mail.
Modifica per aggiungere:
Per spiegare la query di cui sopra ...
L'idea è quella di partecipare al tavolo contro se stessa. Fai finta di avere due copie del tavolo, ognuna con un nome diverso. Quindi puoi confrontarli tra loro e trovare l'id più basso o per ciascun indirizzo email. Poi vedresti i record duplicati che sono stati creati in seguito e potresti eliminarli. (Stavo visualizzando Excel quando pensavo a questo.)
Per fare quell'operazione su un tavolo, confrontarlo con se stesso ed essere in grado di identificare ciascun lato, si usano gli alias di tabella. x
è un alias di tabella. È assegnato nella clausola from
in questo modo: from <table> <alias>
. x
può ora essere utilizzato altrove nella stessa query per fare riferimento a tale tabella come collegamento.
delete x
avvia la query con la nostra azione e destinazione. Eseguiremo una query per selezionare record da più tabelle e vogliamo eliminare i record visualizzati in x
.
Gli alias vengono utilizzati per fare riferimento a entrambe le "istanze" della tabella. from myTable x join myTable z on x.subscriberEmail = z.subscriberEmail
urta il tavolo contro se stesso dove le e-mail corrispondono. Senza la clausola where che segue, ogni record verrebbe selezionato in quanto potrebbe essere unito a se stesso.
La clausola where
limita i record selezionati. where x.id > z.id
consente l'alias "istanza" x
per contenere solo i record che corrispondono ai messaggi di posta elettronica ma hanno un valore superiore id
. I dati che vuoi veramente nella tabella, gli indirizzi e-mail univoci (con l'id più basso) non faranno parte di x
e non saranno cancellati. Gli unici record in x
saranno record duplicati (indirizzi di posta elettronica) con un valore superiore a id
rispetto al record originale per tale indirizzo di posta elettronica.
Il join e dove clausole potrebbero essere combinati in questo caso:
delete x
from myTable x
join myTable z
on x.subscriberEmail = z.subscriberEmail
and x.id > z.id
Per evitare duplicati, considerare la colonna subscriberEmail una colonna indicizzata UNICO.
Si dovrebbe segna una risposta come "accettata" :-) – watery