Sql 从oracle中删除重复行

Sql 从oracle中删除重复行,sql,oracle,oracle10g,Sql,Oracle,Oracle10g,我正在使用oracle数据库。我想使用表中除一行之外的重复行,这意味着我想删除所有行,但至少应该有一行。 我有一张桌子 employee_id ---- department_id 1 10 2 10 1 20 3 30 2 30 现在我想删除重复的行,但至少应该有一行 select count(

我正在使用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));
我用它来查找多个部门的员工数量,但找不到进一步发展的方法。如果我在那里使用delete,它将删除所有副本,但我想保留一个副本。

从emp中删除 伊诺在哪里 从中选择eno 选择counteno,eno 来自雇员 依诺集团 counteno>1

编辑:我想保留员工id
任何可以进一步指导我的人

都可以使用子查询删除重复的行

delete from employee a
where employee_id in (
   select employee_id 
   from employee b
   where b.department_id > a.department_id )
这里我们看到一个使用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函数的一个示例,用于识别和删除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将主键引用完整性约束放在表上,但许多商店不使用RI,因为它们需要灵活性

使用子查询删除重复的行

这里我们看到一个使用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函数的一个示例,用于识别和删除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将主键引用完整性约束放在表上,但许多商店不使用RI,因为它们需要灵活性

从名称中删除 其中ROWID>从名称b中选择MINROWID,其中b.name=a.name和b.age=a.age

从名称a中删除
WHERE ROWID>从名称b中选择MINROWID,其中b.name=a.name和b.age=a.age

@ZanShah120-您介意保留哪一行吗?你在乎员工1留在部门10还是部门20吗?@ZanShah120-这是什么意思?我相信您希望保留一行具有employee_id 1。您发布的数据中没有重复的行。有两行的员工id为1,但它们的部门id值不同。您希望保留两个部门id值中的哪一个?你总是想要最大的部门id吗?最小的?还有什么吗?@JustinCave有一个员工1,属于2个部门,因此他在表中有重复的条目,我想删除其中的任何一个entry@ZanShah120-那么,你不在乎员工id 1最终是进入部门id 10还是20?你不在乎员工id 2最终是在部门id 10还是30?可能是@ZanShah120的重复-你在乎保留哪一行吗?你在乎员工1留在部门10还是部门20吗?@ZanShah120-这是什么意思?我相信您希望保留一行具有employee_id 1。您发布的数据中没有重复的行。有两行的员工id为1,但它们的部门id值不同。您希望保留两个部门id值中的哪一个?你总是想要最大的部门id吗?最小的?还有什么吗?@JustinCave有一个员工1,属于2个部门,因此他在表中有重复的条目,我想删除其中的任何一个entry@ZanShah120-那么,你不在乎员工id 1最终是进入部门id 10还是20?你不在乎员工id 2最终是进入部门id 10还是部门id 30?许多商店的可能副本不使用RI,因为他们需要灵活性,这些商店在处理损坏的数据时不可避免地要付出代价。许多商店不使用RI,因为他们需要灵活性,而这些商店在处理损坏的数据时不可避免地要付出代价损坏的数据。