Oracle:不存在不同值时如何删除重复行?

Oracle : How to delete duplicates rows when no distinct value exists?

我们有一个 table,其中有很多行重复(2 到 4 次)(每行的每一列都具有相同的值)。 table 有 4 列但没有主键。

那么如何删除重复的行呢?

Instance  status  updatetime              name
-----------------------------------------------
gdt546    4       2016/02/13 10:13:18     basic
gdt546    4       2016/02/13 10:13:18     basic
ort87a    1       2016/02/16 19:09:43     High
ort87a    1       2016/02/16 19:09:43     High
ort87a    1       2016/02/16 19:09:43     High

已编辑:

输出应该是:

 Instance  status  updatetime              name
-----------------------------------------------
gdt546    4       2016/02/13 10:13:18     basic
ort87a    1       2016/02/16 19:09:43     High

假设 table 的名称是 TABLE_NAME 并且目的是删除重复行以便只保留其中一个,请找到以下查询:

DELETE FROM table_name A 
WHERE  A.ROWID > ANY (SELECT B.ROWID 
                      FROM   table_name B 
                      WHERE  A.INSTANCE = B.INSTANCE 
                             AND A.status = B.status 
                             AND A.updatetime = B.updatetime 
                             AND A.name = B.name); 

这里有一个基于解析函数 row_number() 的解决方案。这是您要删除的 table:

SQL> select * from test1;
INSTANCE|STATUS|UPDATETIME         |NAME    
--------+------+-------------------+--------
gdt546  |     4|2016-02-13 10:13:18|basic   
gdt546  |     4|2016-02-13 10:13:18|basic   
ort87a  |     1|2016-02-16 19:09:43|High    
ort87a  |     1|2016-02-16 19:09:43|High    
ort87a  |     1|2016-02-16 19:09:43|High   

这里您删除了行的重复数据:

SQL> select instance, status, updatetime, name from 
     ( select row_number() over (partition by instance, status, 
       updatetime, name order by status) as rn, test1.* from test1 ) a
     where a.rn = 1 ;
INSTANCE|STATUS|UPDATETIME         |NAME    
--------+------+-------------------+--------
gdt546  |     4|2016-02-13 10:13:18|basic   
ort87a  |     1|2016-02-16 19:09:43|High