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

如何在SQL中从两列获取唯一无序配对?以Dummy表为例

嘿,我来帮你搞定这个无序配对去重的问题!你的Dummy表要取出(col1, col2)的唯一配对,也就是像(a,b)和(b,a)这类互为反向的配对只留一个,还得避免遗漏像(d,c)这类可能被之前错误查询漏掉的记录,对吧?下面给你几个靠谱的SQL方案:

方案1:用LEAST/GREATEST函数快速统一配对形式

这是最简洁的方法,核心思路是把所有无序配对转换成“较小值在前、较大值在后”的统一形式,然后去重就能得到唯一的无序配对。大部分主流数据库(比如MySQL、PostgreSQL、SQL Server 2022+)都支持LEAST()和GREATEST()函数:

SELECT DISTINCT
    LEAST(col1, col2) AS first_val,
    GREATEST(col1, col2) AS second_val
FROM Dummy;

这里的DISTINCT是为了处理表中可能存在的重复同一配对(比如多次出现(a,b)),确保最终结果里每个配对只出现一次。

如果你的数据库不支持这两个函数,也可以用CASE语句实现同样的逻辑:

SELECT DISTINCT
    CASE WHEN col1 < col2 THEN col1 ELSE col2 END AS first_val,
    CASE WHEN col1 < col2 THEN col2 ELSE col1 END AS second_val
FROM Dummy;

方案2:自连接方案(适合保留原始列需求)

如果你的场景需要保留原始的(col1, col2)列,而不是转换成统一的有序形式,可以用自连接的方式。之前的查询遗漏(d,c)很可能是因为逻辑只处理了存在反向配对的情况,比如只筛选了t1.col1 < t2.col1但没考虑没有反向配对的记录。这个方案能覆盖所有情况:

SELECT DISTINCT t1.col1, t1.col2
FROM Dummy t1
LEFT JOIN Dummy t2 
  ON t1.col1 = t2.col2 AND t1.col2 = t2.col1
WHERE 
  -- 要么没有反向配对,要么当前记录的col1小于等于反向记录的col1(避免重复)
  t2.col1 IS NULL OR t1.col1 <= t2.col1;

注意事项:处理NULL值

如果col1或col2可能存在NULL值,LEAST()和GREATEST()会返回NULL(不同数据库逻辑一致),如果你想排除包含NULL的配对,可以加过滤条件:

SELECT DISTINCT
    LEAST(col1, col2) AS first_val,
    GREATEST(col1, col2) AS second_val
FROM Dummy
WHERE col1 IS NOT NULL AND col2 IS NOT NULL;

内容的提问来源于stack exchange,提问作者Parth Parikh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:32:27