どのレコードが「元の」であるかを示すインジケーターとしてid列を使用しているため、次のようになります。
delete x
from myTable x
join myTable z on x.subscriberEmail = z.subscriberEmail
where x.id > z.id
これにより、メールアドレスごとに1つのレコードが残ります。
編集して追加:
上記のクエリを説明するには...
ここでのアイデアは、テーブルをそれ自体に対して結合することです。テーブルのコピーが2つあり、それぞれに異なる名前が付けられていると仮定します。次に、それらを相互に比較して、最小のIDまたは各電子メールアドレスを見つけることができます。その後、後で作成された重複レコードが表示され、それらを削除できます。 (これについて考えるとき、私はExcelを視覚化していました。)
テーブルに対してその操作を実行し、それ自体と比較してそれぞれの側を識別できるようにするには、テーブルエイリアスを使用します。 x テーブルエイリアスです。 fromで割り当てられます 次のような句:from <table> <alias> 。 x 同じクエリの他の場所で使用して、そのテーブルをショートカットとして参照できるようになりました。
delete x アクションとターゲットからクエリを開始します。複数のテーブルからレコードを選択するためのクエリを実行し、xに表示されるレコードを削除します。 。
エイリアスは、テーブルの両方の「インスタンス」を参照するために使用されます。 from myTable x join myTable z on x.subscriberEmail = z.subscriberEmail メールが一致する場所でテーブルをぶつけます。次のwhere句がないと、すべてのレコードが選択されます。これは、それ自体に対して結合される可能性があるためです。
where 句は、選択されるレコードを制限します。 where x.id > z.id 'instance'エイリアスxを許可します メールに一致するが、より高いidを持つレコードのみを含める 価値。テーブルに本当に必要なデータ、一意のメールアドレス(IDが最小)はxの一部にはなりません 削除されません。 xの唯一のレコード idが高い重複レコード(メールアドレス)になります そのメールアドレスの元のレコードよりも。
この場合、join句とwhere句を組み合わせることができます:
delete x
from myTable x
join myTable z
on x.subscriberEmail = z.subscriberEmail
and x.id > z.id
重複を防ぐために、subscriberEmail列をUNIQUEインデックス付き列にすることを検討してください。