首页 > 解决方案 > 在 Oracle 中使用 ROWNUM 或 ROW_NUMBER 删除重复记录

问题描述

我有 Oracle 11g。我有 4 条记录,我想使用 ROWNUM 或 ROW_NUMBER 删除重复记录。表如下。

ID 姓名 部门 薪水
100 尼基尔 产品 12000
100 尼基尔 产品 12000
200 约翰 人力资源 10000
200 约翰 人力资源 10000

我想要这样的输出

ID 姓名 部门 薪水
100 尼基尔 产品 12000
200 约翰 人力资源 10000

标签: sqloracleoracle11g

解决方案


Schema and insert statements:

 create table salarytable (id int,  name varchar(50), dept varchar(50), salary  int);

 insert into salarytable values(100 ,'nikhil','prod', 12000 );
 insert into salarytable values(100, 'nikhil', 'prod', 12000); 
 insert into salarytable values(200, 'john', 'HR', 10000); 
 insert into salarytable values(200, 'john', 'HR', 10000);

Delete Query:

 DELETE FROM salarytable
 WHERE rowid not in
 (SELECT MIN(rowid)
 FROM salarytable
 GROUP BY id ,name ,dept ,salary);

Select Query:

 select * from salarytable;

Output:

ID NAME DEPT SALARY
100 nikhil prod 12000
200 john HR 10000

db<>fiddle here

Delete duplicate with row_number()

Delete query with row_number():

 delete from salarytable
 where  rowid in
 ( select rwid
   from ( select rowid rwid
          ,      row_number() over ( partition by id order by id) rn
          from   salarytable
        )
   where  rn>1
 )

Select Query:

 select * from salarytable;

Output:

ID NAME DEPT SALARY
100 nikhil prod 12000
200 john HR 10000

db<>fiddle here


推荐阅读