Protože sloupec id používáte jako indikátor toho, který záznam je 'původní':
delete x
from myTable x
join myTable z on x.subscriberEmail = z.subscriberEmail
where x.id > z.id
Tím zůstane jeden záznam na e-mailovou adresu.
upravit a přidat:
Pro vysvětlení výše uvedeného dotazu...
Smyslem je připojit se ke stolu proti sobě. Předstírejte, že máte dvě kopie tabulky, každá pojmenovaná jinak. Pak je můžete porovnat a najít nejnižší id nebo pro každou e-mailovou adresu. Pak byste viděli duplicitní záznamy, které byly vytvořeny později, a mohli je smazat. (Když jsem o tom přemýšlel, představoval jsem si Excel.)
Chcete-li provést tuto operaci na tabulce, porovnat ji se sebou a být schopni identifikovat každou stranu, používáte aliasy tabulky. x
je alias tabulky. Je přiřazen v from
klauzuli takto:from <table> <alias>
. x
lze nyní použít jinde ve stejném dotazu k odkazování na tuto tabulku jako zástupce.
delete x
zahájí dotaz naší akcí a cílem. Provedeme dotaz na výběr záznamů z více tabulek a chceme odstranit záznamy, které se objevují v x
.
Aliasy se používají k označení obou „instancí“ tabulky. from myTable x join myTable z on x.subscriberEmail = z.subscriberEmail
narazí stůl proti sobě, kde se e-maily shodují. Bez klauzule where, která následuje, by byl každý záznam vybrán, protože by mohl být spojen proti sobě.
where
klauzule omezuje záznamy, které jsou vybrány. where x.id > z.id
umožňuje 'instanci' alias x
obsahovat pouze záznamy, které odpovídají e-mailům, ale mají vyšší id
hodnota. Data, která opravdu chcete mít v tabulce, jedinečné e-mailové adresy (s nejnižším ID) nebudou součástí x
a nebudou smazány. Jediné záznamy v x
budou duplicitní záznamy (e-mailové adresy), které mají vyšší id
než původní záznam pro tuto e-mailovou adresu.
Spojení a klauzule where lze v tomto případě kombinovat:
delete x
from myTable x
join myTable z
on x.subscriberEmail = z.subscriberEmail
and x.id > z.id
Chcete-li předejít duplicitám, zvažte vytvoření sloupce subscriberEmail jako UNIKÁTNÍ indexovaný sloupec.