Oracleのデータ重複排除

WBOY
リリース: 2023-05-18 09:32:07
オリジナル
1333 人が閲覧しました

企業データが増大し続けるにつれて、重複データがデータベース管理における重要な問題となっています。 Oracle データベースでは、データが重複すると不正確なクエリ結果が発生し、ストレージ領域が消費され、データベースのパフォーマンスに影響を与えます。したがって、重複排除が必要です。

この記事では、Oracle データベースの重複データを削除するいくつかの方法を紹介します。

方法 1: サブクエリとグループ化を使用する

重複データを削除する前に、まず重複データとは何かを理解する必要があります。 Oracle データベースでは、すべて同じ列を持つ 2 つ以上のレコードは重複します。

以下は、重複データを含むサンプル テーブルです:

CREATE TABLE employee( emp_id NUMBER(6), first_name VARCHAR2(50), last_name VARCHAR2(50), dept_id NUMBER(4) ); INSERT INTO employee(emp_id, first_name, last_name, dept_id) VALUES(1, 'John', 'Doe', 101); INSERT INTO employee(emp_id, first_name, last_name, dept_id) VALUES(2, 'Jane', 'Doe', 102); INSERT INTO employee(emp_id, first_name, last_name, dept_id) VALUES(3, 'John', 'Doe', 101); INSERT INTO employee(emp_id, first_name, last_name, dept_id) VALUES(4, 'Bob', 'Smith', 103);
ログイン後にコピー

重複データを削除し、各従業員のレコードを 1 つだけ保持したい場合は、次の SQL クエリ ステートメントを使用できます:

DELETE FROM employee WHERE emp_id IN (SELECT emp_id FROM (SELECT emp_id, ROW_NUMBER() OVER (PARTITION BY first_name, last_name, dept_id ORDER BY emp_id) rn FROM employee) WHERE rn <> 1);
ログイン後にコピー

この SQL ステートメントは、ROW_NUMBER 関数を使用するサブクエリを使用して、各従業員の最初の行を識別します。次に、残りの行をすべて削除します。

PARTITION BY ステートメントは部門ごとに行をグループ化するために使用され、ORDER BY ステートメントは行を emp_id 順にソートします。 ROW_NUMBER 関数を実行すると、次の結果が得られます。

EMP_ID | FIRST_NAME | LAST_NAME | DEPT_ID | RN -------|------------|-----------|---------|----- 1 | John | Doe | 101 | 1 2 | Jane | Doe | 102 | 1 3 | John | Doe | 101 | 2 4 | Bob | Smith | 103 | 1
ログイン後にコピー

ここでは、同じ部門の John Doe が 1 番目と 3 番目の位置にあることがわかります。これは、2 つの John Doe レコードがあることを意味します。 rn が 1 に等しくない行をすべて削除することで、重複データを削除し、従業員ごとに 1 行を保持できます。

方法 2: 一時テーブルを使用する

もう 1 つの方法は、保持する必要があるデータを格納する一時テーブルを使用することです。次の SQL クエリ ステートメントを使用できます。

CREATE TABLE temp_employee AS SELECT DISTINCT emp_id, first_name, last_name, dept_id FROM employee;
ログイン後にコピー

このステートメントは、employee テーブルから一意の emp_id、first_name、last_name、および dept_id を選択し、それらを temp_employee という新しいテーブルに挿入します。

これで、次の SQL ステートメントを使用して、employee テーブル内のすべての行を削除し、temp_employee テーブル内の行を従業員テーブルに戻すことができます。

DELETE FROM employee; INSERT INTO employee(emp_id, first_name, last_name, dept_id) SELECT emp_id, first_name, last_name, dept_id FROM temp_employee;
ログイン後にコピー

これにより、従業員テーブルからすべての行が削除されます。従業員テーブルを作成し、temp_employee テーブルから従業員テーブルに行を挿入します。これで、重複したレコードがすべて削除され、従業員ごとに 1 行が保持されました。

方法 3: CTE および ROW_NUMBER 関数の使用

これは ROW_NUMBER 関数を使用する別の方法ですが、共通の式 (CTE) を使用します。次の SQL クエリ ステートメントを使用して、重複データを削除できます。

WITH emp AS( SELECT emp_id, first_name, last_name, dept_id, ROW_NUMBER() OVER(PARTITION BY first_name, last_name, dept_id ORDER BY emp_id) rn FROM employee ) DELETE FROM emp WHERE rn > 1;
ログイン後にコピー

このステートメントでは、一般式 emp を使用します。これには、削除する必要があるすべてのレコードが含まれ、各グループの最初のレコードが識別されます。次に、DELETE ステートメントを使用して、すべてのグループ内の残りの行を削除します。

結論

Oracle データベースでは、重複したデータを削除することが非常に重要です。重複データはデータベースのパフォーマンスに影響を与え、ストレージ領域を無駄にし、不正確なクエリ結果につながります。この記事では、サブクエリとグループ化の使用、一時テーブルの使用、CTE 関数と ROW_NUMBER 関数の使用など、重複データを削除するいくつかの方法について説明します。どちらの方法を選択する場合でも、万が一に備えて、レコードを削除する前に必ずデータをバックアップしてください。

以上がOracleのデータ重複排除の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!