ホームページ >データベース >mysql チュートリアル >一意の列を保持しながら PostgreSQL テーブルから重複行を削除するにはどうすればよいですか?

一意の列を保持しながら PostgreSQL テーブルから重複行を削除するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-19 02:43:10115ブラウズ

How to Delete Duplicate Rows from a PostgreSQL Table While Preserving a Unique Column?

一意の列を持つ小さなテーブルから重複行を削除します

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。