删除重复行-Oracle

删除重复行-Oracle,oracle,plsql,duplicate-removal,rowid,Oracle,Plsql,Duplicate Removal,Rowid,下面是我的一些数据的示例。我试图删除QueryID和RoyID与表中其他条目相同的所有额外数据,但是,我希望至少保留一条记录。我不确定我是否能够使用ID列上的min或max函数,因为有些记录具有DEMO_12345等ID ID QUERY_ID ROYALTY_ID RTSQR1652 SQ1421 ROY25644005 RTSQR1653 SQ1421 ROY25636406 RTSQR1654 SQ1421 ROY25636557 RTSQR1655

下面是我的一些数据的示例。我试图删除QueryID和RoyID与表中其他条目相同的所有额外数据,但是,我希望至少保留一条记录。我不确定我是否能够使用ID列上的min或max函数,因为有些记录具有DEMO_12345等ID

ID          QUERY_ID ROYALTY_ID
RTSQR1652   SQ1421  ROY25644005
RTSQR1653   SQ1421  ROY25636406
RTSQR1654   SQ1421  ROY25636557
RTSQR1655   SQ1421  ROY25636558
RTSQR1656   SQ1421  ROY25636559
RTSQR1657   SQ1421  ROY25636560
我想用ROWID代替ID。下面的查询行吗

 DELETE FROM RT_SOURCE_QUERY_ROYALTIES WHERE ROWID NOT IN (
 SELECT MAX(ROWID) FROM RT_SOURCE_QUERY_ROYALTIES GROUP BY ROYALTY_ID, QUERY_ID);

使用自联接删除重复行

检测重复行的最有效方法是将表自身连接起来,如下所示

select 
   book_unique_id, 
   page_seq_nbr, 
   image_key 
from 
   page_image a 
where 
   rowid > 
     (select min(rowid) from page_image b 
      where 
         b.key1 = a.key1 
      and 
         b.key2 = a.key2 
      and 
         b.key3 = a.key3 
      );
请注意,您必须在SQL where子句中指定使行重复的所有列。

使用自联接删除重复行

检测重复行的最有效方法是将表自身连接起来,如下所示

select 
   book_unique_id, 
   page_seq_nbr, 
   image_key 
from 
   page_image a 
where 
   rowid > 
     (select min(rowid) from page_image b 
      where 
         b.key1 = a.key1 
      and 
         b.key2 = a.key2 
      and 
         b.key3 = a.key3 
      );
请注意,您必须在SQL where子句中指定使行重复的所有列。

只需运行一个测试

drop table test1;

create table test1 (a number,b number, c number);

insert into test1 values (1,1,2);
insert into test1 values (1,1,3);
insert into test1 values (1,2,2);
insert into test1 values (2,1,2);
insert into test1 values (2,2,2);
insert into test1 values (1,1,2);

select * from test1;

delete from test1 where rowid not in (select max(rowid) from test1 group by a,b);

select * from test1;
工作如预期,不是吗

table TEST1 dropped.
table TEST1 created.
1 rows inserted.
1 rows inserted.
1 rows inserted.
1 rows inserted.
1 rows inserted.
1 rows inserted.
A B C
- - -
1 1 2 
1 1 3 
1 2 2 
2 1 2 
2 2 2 
1 1 2 

 6 rows selected 

2 rows deleted.
A B C
- - -
1 2 2 
2 1 2 
2 2 2 
1 1 2 
只是做个测试

drop table test1;

create table test1 (a number,b number, c number);

insert into test1 values (1,1,2);
insert into test1 values (1,1,3);
insert into test1 values (1,2,2);
insert into test1 values (2,1,2);
insert into test1 values (2,2,2);
insert into test1 values (1,1,2);

select * from test1;

delete from test1 where rowid not in (select max(rowid) from test1 group by a,b);

select * from test1;
工作如预期,不是吗

table TEST1 dropped.
table TEST1 created.
1 rows inserted.
1 rows inserted.
1 rows inserted.
1 rows inserted.
1 rows inserted.
1 rows inserted.
A B C
- - -
1 1 2 
1 1 3 
1 2 2 
2 1 2 
2 2 2 
1 1 2 

 6 rows selected 

2 rows deleted.
A B C
- - -
1 2 2 
2 1 2 
2 2 2 
1 1 2 
删除中的rowid(记录顺序)与“从测试1组中选择最大值(rowid)由a、b”中的rowid有何关联?select WITH order by可以按任何顺序返回记录。没有受让人。因此,似乎您可能会删除错误的记录。rowid(不是rownum)与“记录顺序”无关,它是记录存储位置的技术表示。OP只想保留一条记录,哪一条是未指定的,并不重要。删除中的rowid(记录顺序)与“按a,b从test1组中选择最大值(rowid)”中的rowid有什么关系?select WITH order by可以按任何顺序返回记录。没有受让人。因此,似乎您可能会删除错误的记录。rowid(不是rownum)与“记录顺序”无关,它是记录存储位置的技术表示。OP只想保留一个记录,哪一个是未指明的,并不重要。