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

如何通过自连接高效查询两列唯一组合(禁用指定函数)

用自连接实现col1和col2的唯一无序组合查询

需求说明

给定如下示例表数据:

SELECT
    t.col1,
    t.col2
FROM (
    VALUES
        ('1212', '2323'),
        ('2323', '1212'),
        ('3434', '1212'),
        ('3434', '4545')
) AS t(col1, col2)

需要找出col1和col2的唯一无序组合(即('1212','2323')与('2323','1212')视为同一组合),最终得到3条结果,且要求:

  • 不使用数组函数或LEAST()/GREATEST()函数
  • 采用自连接方案
  • 优化查询性能

自连接实现方案

通过左连接匹配反向组合,再筛选出唯一的组合记录:

SELECT DISTINCT t1.col1, t1.col2
FROM t t1
LEFT JOIN t t2 
  ON t1.col1 = t2.col2 
  AND t1.col2 = t2.col1
WHERE 
  -- 没有反向组合的记录直接保留
  t2.col1 IS NULL 
  -- 存在反向组合时,只保留col1字典序小于col2的那条,避免重复
  OR t1.col1 < t1.col2;

性能优化要点

  • 建立复合索引:为表建立两个复合索引,覆盖正向和反向匹配的场景,让数据库快速定位反向记录,避免全表扫描:
    CREATE INDEX idx_col1_col2 ON t(col1, col2);
    CREATE INDEX idx_col2_col1 ON t(col2, col1);
    
  • 按需保留DISTINCT:如果表中不存在完全重复的(col1,col2)正向记录,可去掉DISTINCT以提升性能;若存在重复记录,则保留DISTINCT完成去重。

验证结果

执行查询后,会得到预期的3条唯一组合:

  • ('1212', '2323')
  • ('3434', '1212')
  • ('3434', '4545')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 23:56:02