ホームページ > データベース > mysql チュートリアル > SQL でテーブルから重複行を効率的に削除するにはどうすればよいですか?

SQL でテーブルから重複行を効率的に削除するにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2025-01-19 02:47:08
オリジナル
115 人が閲覧しました

How to Efficiently Delete Duplicate Rows from a Table in SQL?

SQL: テーブル内の重複行の削除

チャレンジ:

主キーや制約がなく、同一のデータを持つ複数の行が含まれるテーブルに直面しています。 目標は、重複する行を削除し、一意の各行の 1 つのインスタンスのみを保持することです。 「key」という名前の列を使用して重複を特定し、個別の「key」値ごとにエントリが 1 つだけ存在するようにします。

解決策:

このプロセスには 2 つの重要な手順が含まれます:

  1. 最初の出現の識別: 各重複行の最初のインスタンスを見つけます。
  2. 後続の重複の削除: 手順 1 で特定された最初の重複行以外の行をすべて削除します。

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート