SQL能否实现两列反向重复数据的去重查询?
当然可以实现!这里有几种SQL方案解决反向重复记录问题
针对你需要排除from和to列值反向重复(同时要求from≠to)的需求,我整理了两种常用且易理解的SQL实现方式:
方法1:利用LEAST()和GREATEST()函数分组去重
这种方法适合大部分支持这两个函数的数据库(比如MySQL、PostgreSQL、SQL Server等),核心思路是把反向的成对值统一成相同的组合,再分组保留其中一条记录。
假设你的表名为your_table,SQL代码如下:
SELECT MIN(ID) AS ID, `from`, `to` FROM your_table WHERE `from` != `to` -- 先排除from和to相同的记录 GROUP BY LEAST(`from`, `to`), GREATEST(`from`, `to`) -- 把X-Y和Y-X统一成同一分组 ORDER BY ID;
逻辑解释:
LEAST(from, to)会取两个值中较小的那个,GREATEST(from, to)取较大的那个,这样X-Y和Y-X都会被归为X-Y的分组- 每组取最小的ID(对应你例子里保留ID=1而排除ID=2),最终得到你想要的结果集
方法2:自连接排除反向记录
如果你的数据库不支持LEAST()/GREATEST(),可以用自连接的方式实现:
SELECT t1.* FROM your_table t1 LEFT JOIN your_table t2 ON t1.`from` = t2.`to` AND t1.`to` = t2.`from` AND t1.ID > t2.ID -- 只匹配ID更小的反向记录 WHERE t1.`from` != t1.`to` AND t2.ID IS NULL -- 保留没有对应更小ID反向记录的行 ORDER BY t1.ID;
逻辑解释:
- 把表和自身做左连接,找到所有反向的记录对
- 只保留那些找不到更小ID反向记录的行(比如ID=1找不到比它小的反向记录,会被保留;ID=2能匹配到ID=1,所以会被排除)
两种方法的输出结果
执行上述任意一种SQL,都会得到你期望的结果:
ID from to
1 X Y
3 Z X
4 R L
内容的提问来源于stack exchange,提问作者Sena
相关产品推荐
相关产品推荐

