13

関連する重複した質問/回答をすべて読みましたが、これが最も関連性の高い回答であることがわかりました。

INSERT IGNORE INTO temp(MAILING_ID,REPORT_ID) 
SELECT DISTINCT MAILING_ID,REPORT_IDFROM table_1
;

問題は、col1 と col2 による重複を削除したいだけでなく、table_1 の他のすべてのフィールドを挿入に含めたいということです。

この方法で関連するすべての列を追加しようとしました:

INSERT IGNORE INTO temp(M_ID,MAILING_ID,REPORT_ID,
MAILING_NAME,VISIBILITY,EXPORTED) SELECT DISTINCT  
M_ID,MAILING_ID,REPORT_ID,MAILING_NAME,VISIBILITY,
EXPORTED FROM table_1
;


M_ID(int,primary),MAILING_ID(int),REPORT_ID(int),
MAILING_NAME(varchar),VISIBILITY(varchar),EXPORTED(int)

しかし、すべての行を一時的に挿入しました(重複を含む)

4

7 に答える 7

4

まず、having 句を使用して 2 つのフィールドをグループ化して、重複を見つける必要があります。

    Select identField1, identField2, count(*) FROM yourTable
        GROUP BY identField1, identField2
          HAVING count(*) >1

これが必要なものを返す場合は、それをサブクエリとして使用して、

  DELETE FROM yourTable WHERE field in (Select identField1, identField2, count(*) FROM yourTable
        GROUP BY identField1, identField2
          HAVING count(*) >1 )
于 2013-01-15T15:51:23.750 に答える
2

注:このソリューションは、代替の古い学校のソリューションです。


あなたが望むものを達成できなかった場合は、私の「昔ながらの」方法を試すことができます:

まず、次のクエリを実行して重複レコードを取得します。

select   column1,
         column2,
         count(*)
from     table
group by column1,
         column2
having   count(*) > 1
order by count(*) desc

その後、それらの結果を選択してメモ帳++に貼り付けます。

クエリを選択 メモ帳に貼り付け

ここで、notepad ++ の検索と置換の特殊性を使用して、それらを次のように置き換えます。最初に「削除」してから、このようなクエリを「挿入」します (これ以降、セキュリティ上の理由から、私の値は AAAA になります)。

特記事項: notepad++ 内のデータの最後の行の終わりに別の新しい行を作成してください。これは、正規表現が各行の終わりにある '\r\n' と一致したためです。

ここに画像の説明を入力

次の正規表現を見つけます。\D*(\d+)\D*(\d+)\D*\r\n

文字列に置き換えます:delete from table where column1 = $1 and column2 = $2; insert into table set column1 = $1, column2 = $2;\r\n

最後に、これらのクエリを MySQL Workbench のクエリ コンソールに貼り付けて実行します。各重複レコードは 1 回だけ表示されます。

ここに画像の説明を入力

この回答は、ID のない 2 つの列だけで構成された関係テーブルに対するものです。あなたの状況に適用できると思います。

于 2016-06-23T10:23:22.480 に答える
1

その2つの一意のフィールドをグループ化することで、いつでもプライマリIDを取得できます

select count(*), id as count from table group by col a, col b having count(*)>1;

その後

delete from table where id in ( select count(*), id as count from table group by col a, col b having count(*)>1) limit maxlimit;

max()代わりに使用することもできますlimit

于 2017-05-30T09:26:48.177 に答える
0

大規模なデータ セットで、select 句で複数の列を選択している場合、例: select x,y,z from table1. そして、要件は、2 つの列に基づいて重複を削除することです。上記の例の let y,z では、パフォーマンスが悪い「グループ化」と「サブクエリ」の組み合わせを使用する代わりに、以下を使用できます。

select x,y,z 
from (
select x,y,z , row_number() over (partition by y,z) as index_num
from table1) main
where main.index_num=1
于 2020-01-09T22:15:19.850 に答える