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 には会社名があり、action には業界名があります。

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

私が欲しいのは、実際に保存されている特定の業界の企業の一意の名前とその他のデータです。皆さんが理解できる方法で私の問題を述べたことを願っています。

4

3 に答える 3

18

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

クエリの例:

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

ノート:

  • 「テーブル」と「ID」を代表的な名前に自由に選んでみた
  • フィールドのリスト (「フィールド 1、フィールド 2、...」) には、ID を除くすべてのフィールドを含める必要があります。
  • これは、フィールドと行の数によっては遅いクエリになる可能性がありますが、代替手段と比較して問題ないと思います

編集: 一意のインデックスがない場合は、自動増分の一意のインデックスを追加することをお勧めします。主な理由は、それが優れた設計であるためですが、上記のクエリを実行できるためでもあります。

于 2009-06-25T11:52:08.737 に答える
4
ALTER IGNORE TABLE 'table' ADD UNIQUE INDEX(your cols);

Duplicates get NULL, then you can delete them

于 2009-06-25T11:55:23.707 に答える
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
  )

上記のクエリでは、someFieldとsomeOtherFieldの組み合わせにより、重複を明確に識別する必要があります。

于 2009-06-25T12:24:53.240 に答える