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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:23:18