mysql - 为什么我需要运行此脚本两次才能删除所有重复项?

标签 mysql sql

我所做的是创建一个名为 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

这些都是主键。

最佳答案

一个更好的问题是为什么要使用临时表?

只需将表连接到自身:

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

这也将清理一式三份,总是留下最低的行 idRent .

关键点(请原谅双关语)是额外的连接条件 r.idRent < r2.idRent ,这可以防止行连接到它们自己(通过具有不相等的 ID),并选择最后添加的行进行删除(通过强制一个 ID 小于另一个)。使用 r.idRent != r2.idRent会导致两个重复项被删除。

关于mysql - 为什么我需要运行此脚本两次才能删除所有重复项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18521477/

相关文章:

mysql - 将目录中的数据同步到数据库的实用方法是什么?

sql - 一行平均值的平均值

java - SQLStateConverter.handledNonSpecificException hibernate

php - SQL行自行删除

mysql - UCASE 无法在 MySQL 中使用 AES_DECRYPT

mysql - InnoDB 中是否有可能出现双重读取

php - 关于PHP函数返回值的问题

mysql - 比较两个表中的两列并返回匹配项的总和

mysql - 在特定月份 mysql 之间创建日期

sql - 如何解析数据库中每个单元格的特定值?