SQL查询与删除重复行结果差异的逻辑问题排查
问题分析与修正方案
你的两条SQL逻辑存在三个核心不一致的地方,直接导致处理行数差异极大:
1. 重复判定标准不统一
你定义重复行是column1和column2值完全相同,但查询语句额外按date(实际是你的日期列)分组,这意味着查询找的是「column1+column2+日期列」三者都重复的行;而删除语句只匹配column1和column2相同,完全忽略日期列的匹配,两者的重复判定逻辑完全脱节。
2. 删除语句未过滤关联表t2的范围
查询语句仅统计company_id=10且日期在指定范围内的行,但删除语句只限制了t1的公司和日期范围,没有对关联表t2做任何过滤。这会导致:
- 只要
t1是目标范围内的行,哪怕t2属于其他公司、其他日期,只要column1和column2相同,t1就会被标记为待删除行 - 这会误删大量不属于你查询到的重复组的行
3. 删除语句未匹配日期列(若需要)
如果你实际要删除的是「指定范围内,column1+column2+日期列重复」的行,删除语句缺少t1.日期列 = t2.日期列的条件,会导致跨日期的column1+column2相同行也被误删。
修正后的SQL语句
情况1:重复定义为「column1+column2完全相同」(无关日期)
修正后的查询语句
SELECT column1, column2, COUNT(*) FROM table1 WHERE company_id = 10 AND 日期列 BETWEEN "2017-11-01" AND "2017-11-30" GROUP BY column1, column2 HAVING COUNT(*) > 1;
修正后的删除语句
DELETE t1 FROM table1 t1 INNER JOIN table1 t2 WHERE t1.id < t2.id AND t1.column1 = t2.column1 AND t1.column2 = t2.column2 AND t1.company_id = 10 AND t1.日期列 BETWEEN "2017-11-01" AND "2017-11-30" -- 限制t2也在目标范围内,避免跨范围匹配 AND t2.company_id = 10 AND t2.日期列 BETWEEN "2017-11-01" AND "2017-11-30";
情况2:重复定义为「column1+column2+日期列完全相同」
修正后的查询语句(保留原逻辑)
SELECT column1, column2, 日期列, COUNT( * ) FROM table1 WHERE company_id = 10 AND 日期列 BETWEEN "2017-11-01" AND "2017-11-30" GROUP BY column1, column2, 日期列 HAVING COUNT( * ) > 1;
修正后的删除语句
DELETE t1 FROM table1 t1 INNER JOIN table1 t2 WHERE t1.id < t2.id AND t1.column1 = t2.column1 AND t1.column2 = t2.column2 AND t1.日期列 = t2.日期列 AND t1.company_id = 10 AND t1.日期列 BETWEEN "2017-11-01" AND "2017-11-30" AND t2.company_id = 10 AND t2.日期列 BETWEEN "2017-11-01" AND "2017-11-30";
内容的提问来源于stack exchange,提问作者kruffer
相关产品推荐
相关产品推荐

