检查重复记录的SQL查询在mytable失效,同结构表正常,求排查
咱们一步步拆解这个问题——既然同结构的另一张表能正常返回结果,那问题基本出在mytable本身或者查询的细节上,给你列几个常见的排查方向:
日期字段的实际值不符合预期
你说有一条2018年1月的记录,但可能日期字段的存储格式或具体值和你想的不一样:比如存的是2018-01-31 23:59:59,但你的查询只限定到2018-01-31 00:00:00;或者字段是字符串类型,存的是01/2018这种格式,导致日期匹配逻辑失效。
先跑个简单查询确认这条记录的真实值:SELECT your_date_column FROM mytable WHERE [你定位这条记录的其他条件],看看日期字段到底存的是什么。重复判断的字段或逻辑有差异
你的重复查询语句是不是依赖特定字段分组?比如SELECT col1, col2, COUNT(*) FROM mytable GROUP BY col1, col2 HAVING COUNT(*) > 1。那有可能mytable里这条记录的这些字段其实没有重复项,而另一张表的对应记录确实存在重复。
另外也检查下查询里有没有DISTINCT、额外的WHERE条件,是不是不小心把这条记录过滤掉了。隐性的数据类型或值差异
就算表结构看起来完全相同,也可能存在隐性差异:比如某字符串字段在mytable里是VARCHAR(50),另一张表是CHAR(50),导致mytable的字段带有 trailing 空格,看起来值一样但实际不相等,分组时就不算重复。
可以试试对字符串字段做TRIM()处理后再查询:SELECT TRIM(col1), TRIM(col2), COUNT(*) FROM mytable GROUP BY TRIM(col1), TRIM(col2) HAVING COUNT(*) > 1,看能不能返回结果。表的索引或统计信息异常
极少数情况下,表的索引或统计信息过期,会导致查询优化器选错执行计划,无法返回正确结果。如果是MySQL的话,可以试试执行ANALYZE TABLE mytable;刷新统计信息,再重新运行查询。记录被软删除或存在状态过滤
有没有可能表存在软删除字段(比如is_deleted),这条记录的状态是已删除,但你的查询没排除这个条件?而另一张表的对应记录状态正常,所以能被查到。
内容的提问来源于stack exchange,提问作者ravsun

