2013-08-29 52 views
0

我所做的是創建一個名爲Rent2的臨時表來存放我的客戶端已註冊的所有重複模塊,然後在刪除臨時表之前執行刪除內部聯接語句。爲什麼我需要運行這個腳本兩次刪除所有重複?

但是在完成後總會有剩餘的重複。我在這裏做錯了什麼?

CREATE TABLE IF NOT EXISTS `tblRent2` (
    `IdRent` INT(11) NOT NULL) 
ENGINE = InnoDB; 

INSERT INTO tblRent2 (SELECT IdRent FROM tblRent WHERE IdModule = 1 GROUP BY IdClient HAVING COUNT(IdModule) > 1); 
INSERT INTO tblRent2 (SELECT IdRent FROM tblRent WHERE IdModule = 2 GROUP BY IdClient HAVING COUNT(IdModule) > 1); 
INSERT INTO tblRent2 (SELECT IdRent FROM tblRent WHERE IdModule = 3 GROUP BY IdClient HAVING COUNT(IdModule) > 1); 
INSERT INTO tblRent2 (SELECT IdRent FROM tblRent WHERE IdModule = 4 GROUP BY IdClient HAVING COUNT(IdModule) > 1); 
INSERT INTO tblRent2 (SELECT IdRent FROM tblRent WHERE IdModule = 5 GROUP BY IdClient HAVING COUNT(IdModule) > 1); 
INSERT INTO tblRent2 (SELECT IdRent FROM tblRent WHERE IdModule = 6 GROUP BY IdClient HAVING COUNT(IdModule) > 1); 
INSERT INTO tblRent2 (SELECT IdRent FROM tblRent WHERE IdModule = 999 GROUP BY IdClient HAVING COUNT(IdModule) > 1); 

DELETE r.* FROM tblRent r INNER JOIN tblRent2 r2 ON 
r.idRent = r2.idRent; 

SELECT * FROM tblRent2; 

DROP TABLE tblRent2; 

原始表看起來是這樣的:

IdRent | IDClient | IdModule 
1  | 30  | 999 
2  | 30  | 999 
3  | 31  | 1 
4  | 31  | 1 

這些都是主鍵。

+0

這些不是*主*鍵,它們是*外*鍵(*其他*表的主鍵)。不過,在重複的情況下,你想刪除哪些行? – Bohemian

+0

我知道它們看起來像外鍵,但是將它們用作主鍵,其他表存在但不被引用爲外鍵。 (我們希望通過此修補程序進行更正)。 – overmann

+0

我想刪除的重複項是IdModule重複項,修復後重復的idClients可以存在,只要它們之間存在不同的模塊引用即可。 – overmann

回答

5

更好的問題是爲什麼你要使用臨時表?

剛剛加入該表本身:

DELETE r2 
FROM tblRent r 
JOIN tblRent r2 
    ON r.IDClient = r2.IDClient 
    AND r.IdModule = r2.IdModule 
    AND r.idRent < r2.idRent 

這將清理一式三份過,總是留下一行最低idRent

一個關鍵點(原諒雙關語)是(通過具有不等IDS)的額外連接條件r.idRent < r2.idRent,這防止接合到自己的行,和用於刪除選擇最後添加的行(通過迫使一個ID爲小於另一個)。使用r.idRent != r2.idRent會導致兩個重複被刪除。

+0

我編輯了我的問題關於我的原始表的更多信息。 – overmann

+0

查看已編輯的答案以處理您的問題中的新信息。請注意,這處理重複,一式三份等。 – Bohemian

+0

你是一個天才。謝謝。 – overmann

1

我認爲你的刪除查詢是有缺陷的。刪除關鍵字後不應該要求星號。你可以使用這個查詢。

DELETE FROM tblRent WHERE idRent in (SELECT IdRent FROM tblRent2); 
+0

謝謝我將使用它,但我仍然需要運行腳本兩次以消除所有重複。 – overmann

相關問題