SQL如何删除ID重复行并保留任意一个对应TEXT值
按ID单列去重的SQL实现方案
为什么SELECT DISTINCT *无法满足需求
DISTINCT的作用是对查询返回的所有列的组合值做去重,你的场景下同ID对应的TEXT值不同,整行数据不属于重复项,因此该语句无法实现仅按ID单列去重的效果。
方案1:轻量查询方案(全数据库兼容)
仅需要返回ID和对应任意一条TEXT时,直接对TEXT字段做聚合即可,MIN/MAX都可以,会自动返回同ID下的任意一条TEXT值:
SELECT ID, MAX(TEXT) AS TEXT FROM table_name GROUP BY ID;
方案2:窗口函数方案(支持保留整行数据)
如果需要保留ID对应的整行其他字段,可使用ROW_NUMBER()窗口函数实现,兼容MySQL 8.0+、PostgreSQL、SQL Server、Oracle等所有支持窗口函数的数据库:
SELECT ID, TEXT -- 可补充需要返回的其他字段 FROM ( SELECT *, -- 按ID分组,组内无需特定排序,随机取第一条即可 ROW_NUMBER() OVER (PARTITION BY ID ORDER BY (SELECT 1)) AS rn FROM table_name ) AS temp_table WHERE rn = 1;
方案3:直接删除原表重复行
如果需要直接清理原表中的重复数据,仅保留每个ID的任意一条记录,可使用以下写法(以MySQL为例,其他数据库语法略有差异):
DELETE t1 FROM table_name t1 INNER JOIN table_name t2 ON t1.ID = t2.ID AND t1.TEXT > t2.TEXT; -- 写>则保留TEXT最小的记录,写<则保留TEXT最大的记录
内容的提问来源于stack exchange,提问作者Mario Palazuelos
相关产品推荐
相关产品推荐

