SQL で重複を見つけて削除する方法

SQL で重複を見つけて削除する方法

データベース設計のベスト プラクティスでは、UNIQUE 制約を使用してデータベース内の重複を防ぐことをお勧めします。ただし、設計が不十分なデータベースや汚れたデータを操作する場合は、重複を自分で見つけて手動で削除する必要がある場合があります。

SQL データベースで重複を見つける方法とそれらを削除する方法については、以下をお読みください。

サンプル データベースの作成

デモンストレーションのために、この SQL クエリを実行して、名前とスコアの列を持つ Users という名前のテーブルを作成します。

DROP TABLE IF EXISTS Users;

CREATE TABLE Users (
    pk_id int PRIMARY KEY,
    name VARCHAR (16),
    score INT,
);

次のクエリを実行して、いくつかのサンプル値を挿入します。

INSERT INTO
    Users(pk_id, name, score)
VALUES
    (1, 'Jane', 20),
    (2, 'John', 13),
    (3, 'Alex', 32),
    (4, 'John', 46),
    (5, 'Jane', 20),
    (6, 'Mary', 34),
    (7, 'Jane', 20),
    (8, 'John', 13)

これらの行の一部には、名前列の重複した値が含まれていることに注意してください。

SQL を使用してデータベースを操作する方法の詳細な説明が必要な場合は、これらの SQL コマンドとクエリを自由に確認してください。

GROUP BY を使用して重複値を検索する

GROUP BY ステートメントを使用して、特定の条件を満たす値を同じグループに配置できます。

サンプル テーブルの名前は一意である必要があるとしましょう。GROUP BY を使用して、同じ名前を共有する行をグループ化できます。

SELECT name, COUNT(name)
FROM Users
GROUP BY name
HAVING COUNT(name) > 1

COUNT を使用すると、同じ名前のユーザーが複数いる行を選択できます。

このクエリを実行すると、データベースは John と Jane を含む行を重複として返します。

データベースからの重複の削除

重複を見つけたら、DELETE ステートメントを使用してそれらを削除することができます。

この例では、次のクエリを実行します。

WITH cte AS (
    SELECT *
        ROW_NUMBER() OVER (
            PARTITION BY
                name, score
            ORDER BY
                name, score
        ) R
     FROM
        Users
)

DELETE FROM cte
WHERE R > 1;

このクエリは、CTE 式を使用して重複を見つけ、1 つを除いてすべて削除します。

重複データを削除する必要がある理由

重複データの削除は必須ではありません。ただし、重複する行が使用するスペースを解放できます。

行数が少ないということは、クエリの実行速度が大幅に向上し、パフォーマンスが向上することも意味します。このチュートリアルのクエリを使用すると、SQL データベースから重複を見つけて削除できます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です