一意の列を持つ小さなテーブルから重複行を削除します
PostgreSQL データベースでは、重複行を削除することでデータの整合性が強化され、パフォーマンスが最適化されます。制約のない行と重複データ、特に「キー」と呼ばれる特定の列を含むテーブルがあるとします。目標は、重複を削除し、それぞれの一意の「キー」値の単一のインスタンスを保持することです。
単一 SQL コマンド ソリューション
単一の SQL コマンドでこれを行うには、次の手順を使用できます:
1. 最初に繰り返される箇所を特定します: まず、繰り返される各行の最初の出現箇所を特定する必要があります。この情報は、データの単一コピーを保持するために重要です。
<code class="language-sql">SELECT MIN(ctid) AS ctid, key FROM dups GROUP BY key HAVING COUNT(*) > 1;</code>
2. 最初以外の出現を削除します: 最初の出現が特定されると、「ctid」値に基づいて後続の重複をすべて削除できます。 「ctid」列は、テーブル内の行の物理的な位置を表します。
<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); -- 显示重复项的第一次出现: SELECT MIN(ctid) AS ctid, name, surname FROM people GROUP BY (name, surname) HAVING COUNT(*) > 1; -- 删除重复项的非第一次出现: 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; SELECT * FROM people;</code>
このテーブル例には、重複する可能性のある個人データが含まれています。 2 番目のクエリを実行すると、重複が削除され、一意の姓名のみがテーブルに残ります。
以上が一意の列を保持しながら PostgreSQL テーブルから重複行を削除するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。