1

これが私のデータの例です。QueryIDとRoyIDがテーブル内の他のエントリと同じである余分なデータをすべて削除しようとしていますが、少なくとも1つのレコードを保持したいと思います。一部のレコードにはDEMO_12345などのIDがあるため、ID列でminまたはmax関数を使用できるかどうかはわかりません。

ID          QUERY_ID ROYALTY_ID
RTSQR1652   SQ1421  ROY25644005
RTSQR1653   SQ1421  ROY25636406
RTSQR1654   SQ1421  ROY25636557
RTSQR1655   SQ1421  ROY25636558
RTSQR1656   SQ1421  ROY25636559
RTSQR1657   SQ1421  ROY25636560

IDの代わりにROWIDを使うことを考えていました。次のクエリは機能しますか?

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

2 に答える 2

7

テストを実行するだけ

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 
于 2012-10-05T10:43:38.867 に答える
1

http://www.dba-oracle.com/t_delete_duplicate_table_rows.htm

自己結合を使用して重複行を削除します

重複する行を検出する最も効果的な方法は、以下に示すように、テーブルをそれ自体に対して結合することです。

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句で、行を複製するすべての列を指定する必要があることに注意してください。

于 2012-10-05T10:41:36.177 に答える