Использование rowid для удаления дублирующихся строк из базы данных Oracle? - PullRequest
0 голосов
/ 30 августа 2011

Я использую следующий запрос для удаления повторяющихся строк из таблицы. В таблице только 2 столбца (col1 и col2).

delete from tab1 where rowid not in
(select min(rowid) from tab1 t group by col1, col2);

Есть ли какие-либо проблемы, например, некоторые побочные эффекты, если я использую этот запрос для удаления повторяющихся строк?

Ответы [ 2 ]

2 голосов
/ 30 августа 2011

Насколько я могу судить, ваш запрос будет выполняться медленно

Это должно дать вам лучшую производительность

delete t1
from tab1 t1
join tab1 t2
on t1.rowid > t2.rowid 
and t1.col1 = t2.col1 
and t1.col2 = t2.col2

Или вот это (работает на mssql, я думаю, что у Oracle естьтот же синтаксис)

;WITH [CTE DUPLICATE] AS 
(
SELECT 
  ROW_NUMBER() OVER (PARTITION BY col1, col2 ORDER BY id) RN
FROM tab1
)
DELETE FROM [CTE DUPLICATE] WHERE RN > 1
0 голосов
/ 30 августа 2011

Этот запрос в порядке. Вы можете сформулировать это без rownum, как описано в этом вопросе:

Удаление строк Oracle, совпадающих по нескольким значениям

...