SQL はフィールド内の重複したコンテンツを削除し、一意のデータを保持します

非常に興味深い SQL の問題に遭遇しました。実際のアプリケーションでも同様の問題に遭遇するはずです。

印象を深めるためにここに記録してください。

一部のテーブルには重複したコンテンツが含まれるため、一意のコンテンツのみが残るまでテーブル内の重複したコンテンツを削除する必要があります。スクリーンショットを直接アップロードします:
元のテーブル:
ここに画像の説明を挿入します

対象テーブル:
ここに画像の説明を挿入します
元のテーブルのワードフィールドの重複した内容を削除して1つだけ残し、それに対応する他のフィールドのデータも保持します。

基本的な方法 1:

まず、単語フィールド内の重複したコンテンツを見つけます (これらのコンテンツは削除する必要があります)。

select word from query_test group by  word having count(word)>1;

次に、これらの重複コンテンツに対して保持する必要がある一意の値を決定します (ID によって決定されます)。

select min(id) from query_test group by word having count(word)>1;
--word字段重复内容对应的最小id,有几个word重复,对应几个最小id

最後に、重複したコンテンツを削除し、重複しない一意のコンテンツを維持します。

delete from query_test where word in 
(select word from query_test group by word having count(word)>1) 
and id not in (select min(id) from query_test group by word having count(word)>1);

このように書くと Mysql がエラーを報告する可能性があります (更新テーブルは独自のテーブルを参照できません)。それに対処するにはエイリアスを追加する必要があります。

delete from query_test where word in(select b.word from 
(select word from query_test group by word having count(word)>1) b) 
and id not in (select a.id from 
(select min(id) as id  from query_test group by word having count(word)>1)a);

高度な方法

上司が提案した方法は簡単です。

delete from query_test where id not in (select max(id) from query_test group by word);

同様に、mysql の場合も処理が必要ですが、ここでは示しません。
問題がある場合は、それを指摘してください。また、一緒に議論して前進するための他の方法を提案することも歓迎します。

おすすめ

転載: blog.csdn.net/weixin_55549435/article/details/114057987