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
相关产品推荐
相关产品推荐

