You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 11:38:14