2009-06-25 10 views
4

私は削除するレコードが重複しているデータベースをデータベースに持っています。私はこれのための別個のエントリを持つ新しいテーブルを作成したくありません。私が望むのは、新しいテーブルを作成せずに既存のテーブルから重複したエントリを削除することです。これを行う方法はありますか?テーブルから重複する行を削除する

id   action 
L1_name  L1_data 
L2_name  L2_data 
L3_name  L3_data 
L4_name  L4_data 
L5_name  L5_data 
L6_name  L6_data 
L7_name  L7_data 
L8_name  L8_data 
L9_name  L9_data 
L10_name  L10_data 
L11_name  L11_data 
L12_name  L12_data 
L13_name  L13_data 
L14_name  L14_data 
L15_name  L15_data 

これらすべてを見るには、私のフィールドです:
IDは、すべての行に対して一意です。
L11_dataは、それぞれのアクションフィールドで一意です。
L11_dataには企業名があり、アクションには業界の名前が付いています。

私のデータには、L11_dataの企業名がそれぞれの業界で重複しています。

私がしたいのは、特定の業界の企業のユニークな名前とその他のデータです。私はあなたの人々がそれを理解できる方法で私の問題を述べたことを願っています。

+1

コードの回答が必要な場合は、重複したデータを持つテーブルのスキーマを指定する必要があります。また、より多くの意見を得るために質問にSQLタグを残して、問題が満足に答えられる可能性を高める必要があります。 – Welbog

答えて

12

はい、一意のIDフィールドがあると仮定すると、そのID以外のすべてのレコードを削除できますが、値のグループには「最小ID」はありません。

例クエリ:

DELETE FROM Table 
WHERE ID NOT IN 
(
SELECT MIN(ID) 
FROM Table 
GROUP BY Field1, Field2, Field3, ... 
) 

  • Iは、自由に代表名
  • としてフィールド( "フィールド1、フィールド2、のリストを "表" と "ID" を選択しました.. ")は、ID以外のすべてのフィールドを含める必要があります
  • これはフィールドと行の数に応じて遅いクエリかもしれませんが、私はそれが代替と比較して大丈夫だろうと期待して

EDIT:一意のインデックスがない場合は、単に自動インクリメンタルユニークインデックスを追加することをお勧めします。主にそれは良いデザインだからですが、上記のクエリを実行できるようになるためです。

+0

これはIDが数字である限りクールです –

+0

IDは通常数字であるので問題にはなりませんが、実際にはIDに "MIN"が定義されている限り動作します。それが文字列で定義されていてフィールドが一意であれば、それはうまくいくでしょう。 –

+0

私はあなたのソリューションが好きです..明確にしたかったです...テーブルにもユニークなインデックスがない場合、問題に複数のオプションがあることが良いです。 –

4
ALTER IGNORE TABLE 'table' ADD UNIQUE INDEX(your cols); 

重複は、あなたがはっきりと重複を識別する必要があります上記のクエリではsomeFieldとsomeOtherFieldの組み合わせをそれら

0
DELETE 
FROM table_x a 
WHERE rowid < ANY (
    SELECT rowid 
    FROM table_x b 
    WHERE a.someField = b.someField 
    AND a.someOtherField = b.someOtherField 
) 
WHERE (
    a.someField, 
    a.someOtherField 
) IN (
    SELECT c.someField, 
    c.someOtherField 
    FROM table_x c 
    GROUP BY c.someField, 
    c.someOtherField 
    HAVING count(*) > 1 
) 

を削除することができ、NULLを取得します。

関連する問題