3


0

同一の行の各セットのコピーが1つだけ残っているように、データベースを特定のフィールド行による同一性から消去する方法

私はテーブルを持っています:

CREATE TABLE table1(フィールド1 varchar(255)、フィールド2 varchar(255));

不要な行のコピーからtable1を削除して、同じfield1を持つ各行のセットからランダムな行を残します。

  • UPD *:MySQL互換のコマンドを投稿してください。

6 Answer


4


最も簡単な方法は、MySQL固有の ALTER IGNOREコマンドを利用することです。 インデックスを作成して行を削除するのは直感的ではありませんが、うまく機能します。 IGNOREキーワードは、インデックスを作成すると、重複した行が削除されることを意味します。 そして、以下に作成するインデックスを適切な場所に残すことで、将来の重複を防ぐことができます。 この動作を望まないのであれば、作成後にインデックスを削除するだけです。

ALTER IGNORE TABLE table1追加ユニークインデックスindexname(field1、field2)


1


MySQLの場合:

CREATE TABLE `new_table` LIKE` table1`; INSERT INTO `new_table`(SELECT * FROM` table1` GROUP BY field1); DROP TABLE `table1`;テーブル名をnew_tableからtable1に変更します。

これは「ランダムな」重複行を正確に選択するわけではありませんが、それを気にしないのであれば、望んでいることを達成することがあります。

他のフィールドと組み合わせて一意である必要があるフィールドがさらにある場合は、それらをGROUP BY句に追加します。

編集:古い答えに戻った


1


Fragsworthの答えを避けて、私はこう思います。

  1. 新しいテーブルを作成します。NEW_TABLE

  2. `field1`を主キーとして定義します

  3. 古いテーブルからNEW_TABLEに行を挿入します

  4. 古いテーブルを削除する

  5. NEW_TABLEの名前を、古いテーブルが呼び出されたものに変更します。

主キーは、同じfield1値を持つ行が挿入されるのを防ぎ、後のクエリでは全体的に良くなります。


0


これを行う必要があります(SQL Serverでは未テスト)。

SELECT field1、field2 INTO #temp FROM(SELECT ROW_NUMBER()OVER(PARTITION BY field1 ORDER BY NEWID())AS __ROW、* FROM table1)x WHERE x .__ ROW = 1;

DELETE table1;

INSERT table1 SELECT field1、field2 FROM #temp;


0


新しいテーブルを作成するか、一意のキーを追加して自己結合し、最小キー以外のすべてを削除します。

'' '' '

新しいテーブル

ですから、ダップせずに新しいテーブルを作ることができます。 あなたはすでにこれについて考えていると思います。

CREATE TABLE new_test(フィールド1整数、フィールド2整数); INSERT INTO new_test(field1、field2)SELECT DISTINCT field1、field2 FROMテストから。 DROP TABLEテスト。 RENAME TABLE new_testテスト;

もしあなたがユニークキーを持っていたら、自己結合をして最小値よりもユニークキー `>`を持つことでターゲットを識別することができます。 あなたがそのような鍵を持っていなかったならば、あなたはそれを作ることができます:

一意のキーを作る:

ALTER TABLE t2 ADD COLUMN(pk整数NULLではないAUTO_INCREMENT、PRIMARY KEY(pk))。

とにかく、今、あなたは自己加入をして、MIN(pk)を保つことができます:

自己結合して重複を削除します。

mysql> DELETE dups。* t2 ASから内部結合(SELECT field1、field2、MIN2(pk)をMP2で、field1、field2にCOUNT(*)> 1を持たせたまま) keep.field2 = dups.field2 AND keep.MPK <> dups.pk;


0


そのためにはMYSQLの ALTER IGNORE構文を使用できます。 次のコマンドは重複を取り除き、ランダムな行を残します。

テーブルtable1を無視する変更一意のインデックスindex1(field1)を追加します。

インデックスを適切な位置に保持するのが賢明なので、新しい重複を追加することはできません。 しかし、あなたが望むなら、あなたは次のようにインデックスを削除することができます。

テーブルtable1を削除し、インデックスindex1を削除します。