どのレコードが「元の」であるかを示すインジケーターとして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インデックス付き列にすることを検討してください。