2013-08-29 113 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

相关问题