如何检测表中ID重复但NAME/DATE不同的记录?
检测ID重复但NAME/DATE字段值不同的记录
需求:找出ID重复,但NAME或DATE字段值存在差异的记录,ID、NAME、DATE三者完全重复的属于正常情况,无需排查。
原SQL的问题
你之前的SQL语句是按ID, NAME, DATE分组并统计重复次数,这实际是在筛选三者完全重复的记录,和需求完全相反,因此无法得到目标结果。
解决方案
以下提供几种可行的SQL写法,适配不同数据库环境:
方法1:子查询关联(兼容多数数据库)
先筛选出存在多个不同NAME+DATE组合的ID,再关联原表获取对应记录:
SELECT t.ID, t.NAME, t.DATE FROM TABLE t INNER JOIN ( SELECT ID FROM TABLE GROUP BY ID -- 判断同一ID下有不同的NAME+DATE组合 HAVING COUNT(DISTINCT CONCAT(NAME, DATE)) > 1 ) dup_ids ON t.ID = dup_ids.ID;
方法2:窗口函数写法(支持窗口函数的数据库:MySQL8.0+/PostgreSQL/SQL Server等)
通过窗口函数按ID分组,计算每个ID下不同的NAME+DATE组合数,直接筛选符合条件的记录:
SELECT ID, NAME, DATE FROM ( SELECT ID, NAME, DATE, COUNT(DISTINCT CONCAT(NAME, DATE)) OVER (PARTITION BY ID) AS combo_count FROM TABLE ) t WHERE combo_count > 1;
方法3:更直观的分组判断
如果想直接判断NAME或DATE是否存在差异,可以修改子查询的HAVING条件:
SELECT t.ID, t.NAME, t.DATE FROM TABLE t INNER JOIN ( SELECT ID FROM TABLE GROUP BY ID -- 同一ID下NAME有多个值,或DATE有多个值 HAVING COUNT(DISTINCT NAME) > 1 OR COUNT(DISTINCT DATE) > 1 ) dup_ids ON t.ID = dup_ids.ID;
内容的提问来源于stack exchange,提问作者HoussemEddine JLASSI
相关产品推荐
相关产品推荐

