sql >> データベース >  >> RDS >> Mysql

重複する行を削除して、最も古い行のみを残しますか?

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



    1. SQL Server(T-SQL)でユーザー定義データ型の名前を変更する

    2. MYSql config bind-addressは0.0.0.0に設定されていますが、netstatはUbuntuでは異なって表示されます

    3. T-SQLを使用してリンクサーバーオプションを編集する方法

    4. Spring DATA JPAを使用してカスタムクエリを作成しますか?