資料表中常因缺乏唯一約束而產生重複列。本文提供單欄位、多欄位、臨時表輔助、存儲過程等多種去重方案,並附測試數據與表結構。
SELECT * FROM questions
WHERE question_title IN (
SELECT question_title FROM questions
GROUP BY question_title HAVING COUNT(question_title) > 1
);
DELETE FROM questions
WHERE id IN (
SELECT id FROM questions
GROUP BY question_title HAVING COUNT(question_title) > 1
) AND id NOT IN (
SELECT MIN(id) FROM questions
GROUP BY question_title HAVING COUNT(question_title) > 1
);
直接刪除語法在某些版本不支援,建議採用臨時表:
CREATE TABLE tmp AS
SELECT question_id FROM questions
WHERE (questions_title, questions_scope) IN (
SELECT questions_title, questions_scope FROM questions
GROUP BY questions_title, questions_scope HAVING COUNT(*) > 1
) AND question_id NOT IN (
SELECT MIN(question_id) FROM questions
GROUP BY questions_title, questions_scope HAVING COUNT(*) > 1
);
DELETE FROM questions WHERE question_id IN (SELECT question_id FROM tmp);
DROP TABLE tmp;
DECLARE @max INT, @id INT;
DECLARE cur_rows CURSOR LOCAL FOR
SELECT 主鍵, COUNT(*) FROM 表名 GROUP BY 主鍵 HAVING COUNT(*) > 1;
OPEN cur_rows;
FETCH cur_rows INTO @id, @max;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @max = @max - 1;
SET ROWCOUNT @max;
DELETE FROM 表名 WHERE 主鍵 = @id;
FETCH cur_rows INTO @id, @max;
END
CLOSE cur_rows;
SET ROWCOUNT 0;
文中提供完整 CREATE TABLE 及 INSERT 語句,可直接複製執行驗證上述方案。