Удалить повторяющиеся строки - Oracle
Вот пример некоторых моих данных. Я пытаюсь удалить все дополнительные данные, где QueryID и RoyID совпадают с другими записями в таблице, однако я хотел бы сохранить хотя бы одну запись. Я не уверен, что смогу использовать функции min или max в столбце ID, так как некоторые записи имеют идентификаторы, такие как DEMO_12345 и т. Д.
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);
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
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.