如何对表中两列执行去重并返回对应行所有列的SQL实现方法
基于SOURCE、TARGET两列去重的SQL查询方案
核心需求:对数据表中SOURCE、TARGET两列的组合值进行去重,重复组合仅保留一条数据,返回所有列的完整内容。
通用实现方案(支持MySQL 8.0+、PostgreSQL、Oracle、SQL Server)
使用窗口函数实现,灵活性更高,可自定义重复数据的保留规则:
SELECT ID, TITLE, SOURCE, TARGET FROM ( SELECT *, -- 按SOURCE、TARGET组合分组,同组内按ID升序排序 ROW_NUMBER() OVER (PARTITION BY SOURCE, TARGET ORDER BY ID) AS rn FROM 替换为你的实际表名 ) temp_table WHERE rn = 1;
说明:如果需要保留重复数据中ID最大的条目,只需将ORDER BY ID修改为ORDER BY ID DESC即可。
MySQL 5.x 低版本兼容方案
低版本MySQL不支持窗口函数,可通过分组+关联查询实现:
SELECT t1.* FROM 替换为你的实际表名 t1 INNER JOIN ( -- 先查询每个SOURCE、TARGET组合下最小的ID SELECT MIN(ID) AS min_id FROM 替换为你的实际表名 GROUP BY SOURCE, TARGET ) t2 ON t1.ID = t2.min_id;
执行效果
以上两种方案执行后,均可得到预期的去重结果:
ID TITLE SOURCE TARGET 1 asd 12 2 2 asd1 123 125 3 asd1 123 56 5 asd3 164 146
内容的提问来源于stack exchange,提问作者Goku
相关产品推荐
相关产品推荐

