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)
これらの行の一部には、name 列の重複した値が含まれていることに注意してください。
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 データベースから重複を見つけて削除できます。