Nếu thêm khóa chính không phải là một tùy chọn, thì một cách tiếp cận sẽ là lưu trữ DISTINCT trùng lặp trong bảng tạm thời, xóa tất cả các bản ghi trùng lặp khỏi bảng hiện có, sau đó thêm lại các bản ghi vào bảng gốc từ bảng tạm thời .
Ví dụ (được viết cho SQL Server 2008, nhưng kỹ thuật này giống nhau cho bất kỳ cơ sở dữ liệu nào):
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
Tôi không chắc sqlite có ROW_NUMBER()
hàm loại hay không, nhưng nếu có, bạn cũng có thể thử một số phương pháp được liệt kê ở đây: Xóa bản ghi trùng lặp khỏi bảng SQL mà không có khóa chính