Maison  >  Article  >  base de données  >  Déduplication des données Oracle

Déduplication des données Oracle

WBOY
WBOYoriginal
2023-05-18 09:32:071419parcourir

À mesure que les données d'entreprise continuent de croître, les données en double sont devenues un problème important dans la gestion des bases de données. Dans la base de données Oracle, les données en double entraîneront des résultats de requête inexacts, consommeront de l'espace de stockage et affecteront les performances de la base de données. La déduplication est donc nécessaire.

Cet article présentera plusieurs méthodes pour supprimer les données en double dans la base de données Oracle.

Méthode 1 : Utilisation de sous-requêtes et de regroupements

Avant de supprimer les données en double, nous devons d'abord comprendre ce que sont les données en double. Dans la base de données Oracle, deux enregistrements ou plus sont des doublons s'ils ont tous les mêmes colonnes.

Ce qui suit est un exemple de table contenant des données en double :

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);

Si nous souhaitons supprimer les données en double et ne conserver qu'un seul enregistrement pour chaque employé, nous pouvons utiliser l'instruction de requête SQL suivante :

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);

Cette instruction SQL utilise une sous-requête , cette sous-requête utilise la fonction ROW_NUMBER pour identifier la première ligne de chaque employé. Ensuite, il supprime toutes les lignes restantes.

L'instruction PARTITION BY est utilisée pour regrouper les lignes dans chaque département, et l'instruction ORDER BY trie les lignes dans l'ordre emp_id. Après avoir exécuté la fonction ROW_NUMBER, nous obtenons le résultat suivant :

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

Ici nous pouvons voir que dans le même département, John Doe est en 1ère et 3ème positions, ce qui signifie qu'il y a deux enregistrements John Doe. En supprimant toutes les lignes où rn n'est pas égal à 1, nous pouvons supprimer les données en double et conserver une ligne pour chaque employé.

Méthode 2 : Utiliser une table temporaire

Une autre méthode consiste à utiliser une table temporaire, qui stocke les données que nous devons conserver. Nous pouvons utiliser l'instruction de requête SQL suivante :

CREATE TABLE temp_employee AS 
SELECT DISTINCT emp_id, first_name, last_name, dept_id
FROM employee;

Cette instruction sélectionnera les emp_id, first_name, last_name et dept_id uniques dans la table des employés et les insérera dans une nouvelle table appelée temp_employee.

Maintenant, nous pouvons supprimer toutes les lignes de la table des employés et déplacer les lignes de la table temp_employee vers la table des employés en utilisant l'instruction SQL suivante :

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;

Cela supprimera toutes les lignes de la table des employés et déplacera les lignes de la table temp_employee Insérer dans la table des employés. Nous avons désormais supprimé tous les enregistrements en double et conservé une ligne pour chaque employé.

Méthode 3 : Utilisation de la fonction CTE et ROW_NUMBER

Il s'agit d'une autre méthode utilisant la fonction ROW_NUMBER, mais elle utilise une expression commune (CTE). L'instruction de requête SQL suivante peut être utilisée pour supprimer les données en double :

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;

Cette instruction utilise l'expression générale emp, qui inclut tous les enregistrements que nous devons supprimer et identifie le premier enregistrement de chaque groupe. Il utilise ensuite l'instruction DELETE pour supprimer les lignes restantes de tous les groupes.

Conclusion

Dans la base de données Oracle, il est très important de supprimer les données en double. Les données en double affectent les performances de la base de données, gaspillent de l'espace de stockage et conduisent à des résultats de requête inexacts. Cet article explique plusieurs façons de supprimer les données en double, notamment à l'aide de sous-requêtes et de regroupements, à l'aide de tables temporaires et à l'aide des fonctions CTE et ROW_NUMBER. Quelle que soit la méthode que vous choisissez, assurez-vous de sauvegarder vos données avant de supprimer des enregistrements, juste au cas où.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn