ホームページ  >  記事  >  データベース  >  Oracleのデータ重複排除

Oracleのデータ重複排除

WBOY
WBOYオリジナル
2023-05-18 09:32:071410ブラウズ

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。