SQL去重复

本文介绍了一种在没有主键的情况下从数据库表中删除重复记录的方法。通过使用CTE(公共表表达式)结合ROW_NUMBER()函数,可以有效地标识并删除重复的数据行。

有主键的就不用说了,可以通过主键不同进行删除。

无主键的情况下可以用下面的语句

WITH    cte
          AS ( SELECT   * ,
                        ROW_NUMBER() OVER ( PARTITION BY c1[, c2] ORDER BY pk ) rn
               FROM     t1
             )
DELETE  cte
WHERE   rn > 1

PARTITION  BY 分区;ORDER  BY排序

### 去除重复记录的方法 在SQL中,去除重复记录可以通过多种方式实现,具体方法取决于结构需求。以下是几种常见的情况及其对应的处理方式。 #### 完全重复的记录 对于完全重复的记录(即所有字段均重复),可以使用 `SELECT DISTINCT` 语句来获取无重复的结果集。例如: ```sql SELECT DISTINCT * FROM tableName; ``` 如果需要删除这些重复记录并仅保留一条,则可以借助临时进行操作。首先将去重后的数据存入临时,然后删除并重新插入数据[^1]。示例代码如下: ```sql SELECT DISTINCT * INTO #Tmp FROM tableName; DROP TABLE tableName; SELECT * INTO tableName FROM #Tmp; DROP TABLE #Tmp; ``` 此方法适用于设计不周导致的重复问题,通常建议通过增加唯一索引列来预防此类情况的发生。 #### 单个字段重复的记录 当需要根据单个字段(如 `Id`)判断重复时,可以使用子查询结合聚合函数查找或删除多余的记录。以下查询可用于查找重复记录: ```sql SELECT * FROM WHERE Id IN (SELECT Id FROM GROUP BY Id HAVING COUNT(Id) > 1); ``` 若需删除重复记录并保留 `rowid` 最小的一条,则可以使用如下语句: ```sql DELETE FROM WHERE (id) IN ( SELECT id FROM GROUP BY id HAVING COUNT(id) > 1 ) AND rowid NOT IN ( SELECT MIN(rowid) FROM GROUP BY id HAVING COUNT(*) > 1 ); ``` #### 多个字段重复的记录 对于多个字段组合的重复记录(如 `Id` `seq`),同样可以使用子查询与分组聚合的方式进行处理。查找重复记录的语句如下: ```sql SELECT * FROM a WHERE (a.Id, a.seq) IN ( SELECT Id, seq FROM GROUP BY Id, seq HAVING COUNT(*) > 1 ); ``` 删除多余记录并保留 `rowid` 最小的记录可以使用以下语句: ```sql DELETE FROM a WHERE (a.Id, a.seq) IN ( SELECT Id, seq FROM GROUP BY Id, seq HAVING COUNT(*) > 1 ) AND rowid NOT IN ( SELECT MIN(rowid) FROM GROUP BY Id, seq HAVING COUNT(*) > 1 ); ``` #### 其他方法 除了上述方法外,还可以使用更灵活的条件组合来处理复杂场景。例如,以下语句用于删除满足特定条件的重复记录: ```sql DELETE FROM ItemForScore WHERE ifsid NOT IN ( SELECT MIN(ifsid) FROM ItemForScore GROUP BY itemid, topflag, isactive HAVING COUNT(-1) > 1 ) AND itemid IN ( SELECT itemid FROM ItemForScore GROUP BY itemid HAVING COUNT(-1) > 1 ); ``` 该方法通过 `MIN()` 函数确保保留最小的主键值,并结合多字段分组实现精确去重 [^3]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值