从oracle中删除重复行

时间:2012-03-03 08:14:17

标签: mysql sql oracle oracle10g

我正在使用oracle数据库。我想使用表中除了一行之外的重复行,这意味着我想要删除所有行,但至少应该有一行。 我有一张桌子

employee_id ---- department_id
1                     10
2                     10
1                     20
3                     30
2                     30

现在我想删除重复的行,但至少应该有一行。

select count(employee_id),employee_id 
from employee
group by employee_id
having count(employee_id) >1));

我曾用这个来查找多个部门的员工数量但却找不到进一步行动的方法。如果我在那里使用删除它将删除所有重复,但我想保留一个副本。

从empl中删除 在哪里eno( 从中选择eno( select count(eno),eno 来自empl eno分组 有计数(eno)> 1));

编辑:我想保留employee_id 任何可以指导我的人

3 个答案:

答案 0 :(得分:3)

delete from employee a
where employee_id in (
   select employee_id 
   from employee b
   where b.department_id > a.department_id )

答案 1 :(得分:2)

使用子查询删除重复的行

这里我们看到一个使用SQL删除重复表行的示例,使用SQL子查询来标识重复行,手动指定连接列:

DELETE FROM
   table_name A
WHERE
  a.rowid >
   ANY (
     SELECT
        B.rowid
     FROM
        table_name B
     WHERE
        A.col1 = B.col1
     AND
        A.col2 = B.col2
        );

使用RANK删除重复的行

这是RANK函数的一个示例,用于识别和删除Oracle表中的重复行,删除所有重复行,同时保留重复行的初始实例:

delete from $table_name where rowid in
  (
  select "rowid" from
     (select "rowid", rank_n from
         (select rank() over (partition by $primary_key order by rowid) rank_n, rowid as "rowid"
             from $table_name
             where $primary_key in
                (select $primary_key from $table_name
                  group by $all_columns
                  having count(*) > 1
                )
             )
         )
     where rank_n > 1
  )

Oracle最重要的功能之一是能够检测并删除表中的重复行。虽然许多Oracle DBA在表上放置了主键参照完整性约束,但duplicate file finder许多商店不使用RI,因为它们需要灵活性。

答案 2 :(得分:-1)

删除姓名a 在哪里ROWID> (SELECT MIN(ROWID)FROM names b WHERE b.name = a.name AND b.age = a.age