Следующий пример также работает, когда ваш PK является лишь подмножеством всех столбцов таблицы.
(Примечание: мне больше нравится подход с добавлением еще одного столбца суррогатных идентификаторов. Но, возможно, это решение также пригодится.)
Сначала найдите дубликаты строк:
SELECT col1, col2, count(*)
FROM t1
GROUP BY col1, col2
HAVING count(*) > 1
Если их всего несколько, вы можете удалить их вручную:
set rowcount 1
delete from t1
where col1=1 and col2=1
Значение "rowcount" должно быть в n-1 раз больше количества дубликатов. В этом примере есть 2 дубликата, поэтому количество строк равно 1. Если вы получаете несколько повторяющихся строк, вы должны сделать это для каждого уникального первичного ключа.
Если у вас много дубликатов, скопируйте каждый ключ один раз в другую таблицу:
SELECT col1, col2, col3=count(*)
INTO holdkey
FROM t1
GROUP BY col1, col2
HAVING count(*) > 1
Затем скопируйте ключи, но удалите дубликаты.
SELECT DISTINCT t1.*
INTO holddups
FROM t1, holdkey
WHERE t1.col1 = holdkey.col1
AND t1.col2 = holdkey.col2
В ваших ключах теперь есть уникальные ключи. Проверьте, не получили ли вы никакого результата:
SELECT col1, col2, count(*)
FROM holddups
GROUP BY col1, col2
Удалить дубликаты из исходной таблицы:
DELETE t1
FROM t1, holdkey
WHERE t1.col1 = holdkey.col1
AND t1.col2 = holdkey.col2
Вставить исходные строки:
INSERT t1 SELECT * FROM holddups
Кстати, для полноты: в Oracle есть скрытое поле, которое вы можете использовать (rowid):
DELETE FROM our_table
WHERE rowid not in
(SELECT MIN(rowid)
FROM our_table
GROUP BY column1, column2, column3... ;
см .: Сайт знаний Microsoft