SQL自连接查询出现重复冲突记录,如何去重仅保留每条冲突一条结果?
SQL自连接冲突查询去重方案
修改后的查询语句
SELECT t1.id, t1.status, t1.date, t1.serial, t2.id AS id_2, t2.status AS status_2, t2.date AS date_2, t2.serial AS serial_2 FROM `table` AS t1 INNER JOIN `table` AS t2 ON t1.serial = t2.serial AND t1.date = t2.date WHERE t1.id < t2.id ORDER BY t1.date, t1.id;
如果你原表中t2侧的字段名确实是
serial_2、id_2,将ON和WHERE条件里的对应字段名换回你原本的写法即可。
实现逻辑
- 原查询使用
t1.id <> t2.id_2作为判断条件,允许同一组ID对按正反两种顺序匹配,因此同一个冲突会生成两条重复结果 - 改为
t1.id < t2.id的单向大小比较后,仅会保留ID更小的记录放在t1侧、ID更大的放在t2侧的结果,每组冲突仅返回唯一一条记录,同时可以删除冗余的DISTINCT关键字,提升查询性能 - 如果ID为非数值类型无法做大小比较,也可以替换为其他单向判断逻辑,比如
t1.create_time < t2.create_time,只要能固定唯一的排序规则即可。
内容的提问来源于stack exchange,提问作者marcoarib
相关产品推荐
相关产品推荐

