Heim > Datenbank > Orakel > Hauptteil

oracle重复数据删除

WBOY
Freigeben: 2023-05-18 09:32:07
Original
1278 人浏览过

随着企业数据不断增长,重复数据成为数据库管理的一个重要问题。在Oracle数据库中,重复数据会导致查询结果不准确,消耗存储空间并影响数据库性能。因此,删除重复数据是必要的。

本文将介绍几个在Oracle数据库中删除重复数据的方法。

方法一:使用子查询和分组

在删除重复数据之前,我们首先需要了解什么是重复数据。在Oracle数据库中,如果两条或多条记录具有相同的所有列,则这些记录就是重复的。

下面是一个示例表,包含重复数据:

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);
Nach dem Login kopieren

如果我们想要删除重复数据,并且只保留每个employee的一条记录,可以使用以下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);
Nach dem Login kopieren

这个SQL语句使用了一个子查询,该子查询使用ROW_NUMBER函数来标识每个employee的第一行。然后,它删除所有其余的行。

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
Nach dem Login kopieren

这里我们可以看到,在同一部门中,John Doe在第1个和第3个位置,这意味着有两个John Doe记录。通过删除rn不等于1的所有行,我们可以删除重复数据,保留每个员工的一行。

方法二:使用临时表

另一种方法是使用一个临时表,它存放了我们需要保留的数据。我们可以使用以下SQL查询语句:

CREATE TABLE temp_employee AS 
SELECT DISTINCT emp_id, first_name, last_name, dept_id
FROM employee;
Nach dem Login kopieren

此语句将从员工表中选取独特的emp_id,first_name,last_name和dept_id,并将它们插入一个名为temp_employee的新表中。

现在,我们可以删除所有employee表中的行,并使用以下SQL语句将temp_employee表中的行移动回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;
Nach dem Login kopieren

这将从employee表中删除所有行,并将temp_employee表中的行插入employee表中。现在,我们已经删除了所有重复的记录,并保留了每个员工的一行。

方法三:使用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;
Nach dem Login kopieren

此语句使用通用表达式emp,其中包括我们需要删除的所有记录,并标识每个组中的第一条记录。然后,它使用DELETE语句删除所有组中的其余行。

结论

在Oracle数据库中,删除重复数据是非常重要的。重复数据会影响数据库性能,浪费存储空间,并导致查询结果不准确。本文介绍了几种删除重复数据的方法,包括使用子查询和分组,使用临时表和使用CTE和ROW_NUMBER函数。无论您选择哪种方法,都要确保在删除记录之前备份数据,以防万一。

以上是oracle重复数据删除的详细内容。更多信息请关注PHP中文网其他相关文章!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!