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

SQL如何对多列值无序组合去重,仅保留唯一组合?

方案1:通用简洁实现(兼容绝大多数主流数据库)

使用LEAST()(取两个值中较小的)和GREATEST()(取两个值中较大的)函数对列值做标准化,再去重即可:

-- 请将func_relation替换为你实际的表名
SELECT DISTINCT
  LEAST(column_a, column_b) AS column_a,
  GREATEST(column_a, column_b) AS column_b
FROM func_relation;

注:该方案输出的两列值会统一按字典序排列,例如原数据(function H, function G)会输出为(function G, function H),如果你需要保留原始行的列值顺序,请用方案2


方案2:保留原始行的列值顺序

如果你需要保留原表中首次出现的组合的原始列顺序,使用窗口函数ROW_NUMBER()实现:

-- 请将func_relation替换为你实际的表名,ORDER BY后替换为你表中可判断行先后顺序的字段
WITH ranked_pairs AS (
  SELECT
    column_a,
    column_b,
    ROW_NUMBER() OVER(
      PARTITION BY LEAST(column_a, column_b), GREATEST(column_a, column_b)
      ORDER BY id -- MySQL可替换为自增ID,PostgreSQL用ctid,Oracle用rowid
    ) AS row_num
  FROM func_relation
)
SELECT column_a, column_b
FROM ranked_pairs
WHERE row_num = 1;

特殊兼容方案(不支持LEAST/GREATEST的低版本数据库)

用CASE WHEN替代内置函数:

SELECT DISTINCT
  CASE WHEN column_a < column_b THEN column_a ELSE column_b END AS column_a,
  CASE WHEN column_a > column_b THEN column_a ELSE column_b END AS column_b
FROM func_relation;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 22:57:01