企業データが増大し続けるにつれて、重複データがデータベース管理における重要な問題となっています。 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 サイトの他の関連記事を参照してください。