Якщо додавання первинного ключа не є можливим, то одним із підходів буде збереження дублікатів DISTINCT у тимчасовій таблиці, видалення всіх дубльованих записів з існуючої таблиці, а потім додавання записів назад у вихідну таблицю з тимчасової таблиці .
Наприклад (написано для SQL Server 2008, але техніка однакова для будь-якої бази даних):
DECLARE @original AS TABLE([hash] varchar(20), [d] float)
INSERT INTO @original VALUES('A', 1)
INSERT INTO @original VALUES('A', 2)
INSERT INTO @original VALUES('A', 1)
INSERT INTO @original VALUES('B', 1)
INSERT INTO @original VALUES('C', 1)
INSERT INTO @original VALUES('C', 1)
DECLARE @temp AS TABLE([hash] varchar(20), [d] float)
INSERT INTO @temp
SELECT [hash], [d] FROM @original
GROUP BY [hash], [d]
HAVING COUNT(*) > 1
DELETE O
FROM @original O
JOIN @temp T ON T.[hash] = O.[hash] AND T.[d] = O.[d]
INSERT INTO @original
SELECT [hash], [d] FROM @temp
SELECT * FROM @original
Я не впевнений, що sqlite має функцію ROW_NUMBER()
типу, але якщо вона є, ви також можете спробувати деякі з перелічених тут підходів: Видалити повторювані записи з таблиці SQL без первинного ключа