DELETE FROM 用戶表
WHERE id NOT IN (
SELECT MAX(id) FROM 用戶表 GROUP BY col1, col2, col3...
);
GROUP BY 後的欄位即為判斷重複的依據。
-- 找出重複群組
SELECT * FROM 用戶表
WHERE col1+','+col2+...+col5 IN (
SELECT MAX(col1+','+col2+...+col5)
FROM 用戶表
GROUP BY col1,col2,col3,col4
HAVING COUNT(*) > 1
);
或使用 EXISTS 寫法:
SELECT * FROM 用戶表 t1
WHERE EXISTS (
SELECT 1 FROM 用戶表 t2
WHERE t1.col1 = t2.col1 AND t1.col2 = t2.col2
GROUP BY t2.col1, t2.col2 HAVING COUNT(*) > 1
);
SELECT * INTO #aa FROM 用戶表 GROUP BY id1, id2...;
DELETE 用戶表;
INSERT INTO 用戶表 SELECT * FROM #aa;
SELECT IDENTITY(INT,1,1) AS id, * INTO #temp FROM 用戶表;
DELETE #temp WHERE id NOT IN (
SELECT MAX(id) FROM #temp GROUP BY col1, col2, col3...
);
DELETE 用戶表;
INSERT INTO 用戶表(...) SELECT ... FROM #temp;
ALTER TABLE 用戶表 ADD newField INT IDENTITY(1,1);
DELETE 用戶表
WHERE newField NOT IN (
SELECT MIN(newField) FROM 用戶表
GROUP BY 除 newField 外所有欄位
);
ALTER TABLE 用戶表 DROP COLUMN newField;
NOT IN (SELECT MAX(PK)...) 最簡潔。ROW_NUMBER() 配合 CTE 分批刪除,避免長時間鎖表。