2017-05-19 20 views
0

私はMySQLでテーブルの中にたくさんのエントリを挿入しようとしています。私が取り除く必要がある多くの準複製があります。私は1つを除いてすべての半重複を削除したいと思います。以下のコードを実行すると、複数の半重複を持つエントリだけを残して削除したくないものがすべて削除されているようです。他のすべてのエントリを保持している間、どのように半複製の1つを削除することができますか?MySQLを使用してデータベースから重複を削除する

delete from t where (ColA, ColB, ColC) in 
(select * from (select ColA, ColB, ColC from t 
group by ColA, ColB, ColC having count(*) > 1) as t); 
+0

テーブルにID列がありますか? – GurV

+0

私は使用しているデータは、半重複している間に異なるプライマリキーを持つことができます – Swell

答えて

0

さて、私はあなたがwhere を使用せずにこの問題を解決することができるとは思わないしかし、あなたは私のデータベースから同じテーブル

Exempleを使用して

delete from tb_test where idtb_test not in (
select idtb_test from tb_test T1 
WHERE T1.title in (select title from tb_test T2 group by T2.title having count(*) =1) 
) 
DELETESELECT WHEREを操作することはできません

このクエリは、colタイトルで重複しない行を検索し、選択した行以外のすべての行を削除します。

MySQLエラー:

エラーコード:私が正しく理解し、あなたがほとんどすべてを削除したい場合は、句

0

から更新 のターゲット表「tb_test」を指定することはできません1093行が重複していて、削除されていない行は気にしません。
また、わかっているとおり、このテーブルには主キーがあります。

その場合には、このクエリで行うことができる。

delete test_table t3 
where t3.id in (
    select t1.id 
    from test_table t1, 
     (
      select col_a, col_b, col_c 
      from test_table 
      group by col_a, col_b, col_c 
      having count(*) > 1 
     ) s1 
    where t1.col_a = s1.col_a 
     and t1.col_b = s1.col_b 
     and t1.col_c = s1.col_c 
     and t1.id != (
      select min(t2.id) 
      from test_table t2 
      where t1.col_a = t2.col_a 
       and t1.col_b = t2.col_b 
       and t1.col_c = t2.col_c 
      group by col_a, col_b, col_c 
     ) 
    ) 

は基本的に、このクエリは、私の場合にはPKである最小のIDを有するものを除く全ての行の重複を削除します。

PS:これはOracle DBで動作し、現在はMySQLでテストできません。

+0

ほぼ正しいです。主キーは常に一意ですが、他の複数のフィールドは同じです。私は、上記のフィールドがすべて同じであれば、それらの重複したエントリを削除して、残す必要のあるものを削除できることを知っています。 – Swell

+0

私の答えのクエリは、同じcol_a、col_b、col_cを持つすべての行セットに対して、そのセット内の最小の主キーを持つものを除いて、すべてを削除します。 – fen1x

関連する問題