SQL: テーブル内の重複行の削除
チャレンジ:
主キーや制約がなく、同一のデータを持つ複数の行が含まれるテーブルに直面しています。 目標は、重複する行を削除し、一意の各行の 1 つのインスタンスのみを保持することです。 「key」という名前の列を使用して重複を特定し、個別の「key」値ごとにエントリが 1 つだけ存在するようにします。
解決策:
このプロセスには 2 つの重要な手順が含まれます:
次の SQL コマンドはこれを実現します:
<code class="language-sql">DELETE FROM dups a USING ( SELECT MIN(ctid) as ctid, key FROM dups GROUP BY key HAVING COUNT(*) > 1 ) b WHERE a.key = b.key AND a.ctid <> b.ctid;</code>
重要な注意: このメソッドでは、どの特定の行を保持するかを制御できません。
例:
次のサンプル テーブルについて考えてみましょう:
<code class="language-sql">CREATE TABLE people ( name varchar(50) NOT NULL, surname varchar(50) NOT NULL, age integer NOT NULL ); INSERT INTO people (name, surname, age) VALUES ('A.', 'Tom', 30), ('A.', 'Tom', 10), ('B.', 'Tom', 20), ('B', 'Chris', 20);</code>
最初に出現した重複を見つけるには:
<code class="language-sql">SELECT MIN(ctid) as ctid, name, surname FROM people GROUP BY (name, surname) HAVING COUNT(*) > 1;</code>
出力:
ctid | name | surname |
---|---|---|
(0,1) | A. | Tom |
最初以外の重複を削除します:
<code class="language-sql">DELETE FROM people a USING ( SELECT MIN(ctid) as ctid, name, surname FROM people GROUP BY (name, surname) HAVING COUNT(*) > 1 ) b WHERE a.name = b.name AND a.surname = b.surname AND a.ctid <> b.ctid;</code>
残りの行:
<code class="language-sql">SELECT * FROM people;</code>
出力:
name | surname | age |
---|---|---|
A. | Tom | 30 |
B. | Tom | 20 |
B | Chris | 20 |
以上がSQL でテーブルから重複行を効率的に削除するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。