sql去除多条重复数据(多字段)

博客围绕重复数据处理展开,介绍了找到重复数据中的一条、所有重复数据的id、需删除的重复数据id的方法,还提及根据删除某条重复数据的sql演变,但指出该方法效率低,仅适用于小数据范围和手工删除。

1.找到重复数据中的一条数据:

SELECT id FROM s_course GROUP BY xn,xq,kcdm,kcmc,kkxy,bjmc,jszgh,jsxm,xkkh,xkdd,sksj HAVING COUNT(sksj)>1

2.找到所有重复数据的id

SELECT * FROM s_course a WHERE EXISTS (
SELECT xn,xq,kcdm,kcmc,kkxy,jszgh,jsxm,xkkh,xkdd,sksj FROM (
SELECT xn,xq,kcdm,kcmc,kkxy,jszgh,jsxm,xkkh,xkdd,sksj FROM s_course GROUP BY xn,xq,kcdm,kcmc,kkxy,bjmc,jszgh,jsxm,xkkh,xkdd,sksj HAVING COUNT(sksj)> 1) b 
WHERE a.xn=b.xn AND a.xq=b.xq AND a.kcdm=b.kcdm AND a.kcmc=b.kcmc AND a.kkxy=b.kkxy  AND a.jszgh=b.jszgh AND a.xkkh=b.xkkh AND a.xkdd=b.xkdd AND a.sksj=b.sksj)

3.找到所有需要删除的重复数据的id(即在2中除1外的id)

SELECT id FROM (
SELECT * FROM s_course a WHERE EXISTS (
SELECT xn,xq,kcdm,kcmc,kkxy,jszgh,jsxm,xkkh,xkdd,sksj FROM (
SELECT xn,xq,kcdm,kcmc,kkxy,jszgh,jsxm,xkkh,xkdd,sksj FROM s_course GROUP BY xn,xq,kcdm,kcmc,kkxy,bjmc,jszgh,jsxm,xkkh,xkdd,sksj HAVING COUNT(sksj)> 1) b 
WHERE a.xn=b.xn AND a.xq=b.xq AND a.kcdm=b.kcdm AND a.kcmc=b.kcmc AND a.kkxy=b.kkxy  AND a.jszgh=b.jszgh AND a.xkkh=b.xkkh AND a.xkdd=b.xkdd AND a.sksj=b.sksj)
) c WHERE NOT EXISTS (SELECT id FROM (SELECT id FROM s_course  GROUP BY xn,xq,kcdm,kcmc,kkxy,bjmc,jszgh,jsxm,xkkh,xkdd,sksj HAVING COUNT(jszgh)>1) d WHERE d.id=c.id)

4.根据删除重复的某一条重复数据sql演变

delete e from s_course e inner join (
SELECT id FROM s_course  GROUP BY xn,xq,kcdm,kcmc,kkxy,bjmc,jszgh,jsxm,xkkh,xkdd,sksj HAVING COUNT(jszgh)>1) f on e.id=f.id
delete e from s_course e inner join (
SELECT id FROM (SELECT * FROM s_course a WHERE EXISTS (
SELECT xn,xq,kcdm,kcmc,kkxy,jszgh,jsxm,xkkh,xkdd,sksj FROM (
SELECT xn,xq,kcdm,kcmc,kkxy,jszgh,jsxm,xkkh,xkdd,sksj FROM s_course GROUP BY xn,xq,kcdm,kcmc,kkxy,bjmc,jszgh,jsxm,xkkh,xkdd,sksj HAVING COUNT(sksj)> 1) b 
WHERE a.xn=b.xn AND a.xq=b.xq AND a.kcdm=b.kcdm AND a.kcmc=b.kcmc AND a.kkxy=b.kkxy  AND a.jszgh=b.jszgh AND a.xkkh=b.xkkh AND a.xkdd=b.xkdd AND a.sksj=b.sksj)) c WHERE NOT EXISTS (SELECT id FROM (SELECT id FROM s_course  GROUP BY xn,xq,kcdm,kcmc,kkxy,bjmc,jszgh,jsxm,xkkh,xkdd,sksj HAVING COUNT(jszgh)>1) d WHERE d.id=c.id)) f on e.id=f.id

效率低下,仅适用于小数据范围和手工删除数据

### 使用 SQL 拼接字段内容为单个字符串的方法 在 SQL 中,`GROUP_CONCAT` 是一种强大的函数,用于将分组后的多条记录合并成一个字段[^1]。它可以处理多个值并将其拼接为单个字符串,适用于多种场景,例如、设置长度限制等。 #### 调整 `GROUP_CONCAT` 的长度限制 默认情况下,`GROUP_CONCAT` 的最大长度受到 `group_concat_max_len` 参数的限制。如果需要调整该限制,可以通过以下方式实现: ```sql SET GLOBAL group_concat_max_len = 10240; -- 全局生效,启后失效 SET SESSION group_concat_max_len = 10240; -- 当前会话生效 ``` 通过上述语句,可以将拼接结果的最大长度扩展到 10240 字节。需要注意的是,全局设置仅对当前会话有效,服务器启后将恢复默认值[^1]。 #### 使用 `GROUP_CONCAT` 实现字段拼接 假设有一张表 `t_wjdc_answer_exception`,需要按照 `ansuid` 字段分组,并将 `error_msg` 字段的内容拼接成一个字符串。以下是实现方法: ```sql SELECT a.ansuid, GROUP_CONCAT(DISTINCT a.error_msg SEPARATOR ',') AS error_msg FROM t_wjdc_answer_exception a WHERE a.deleteflg = '0' GROUP BY a.ansuid; ``` - `DISTINCT`:确保拼接时去除复值。 - `SEPARATOR ','`:指定拼接时使用的分隔符,默认为逗号`,`。 - `GROUP BY a.ansuid`:按 `ansuid` 字段分组。 #### 示例数据与结果 假设表中有以下数据: | ansuid | error_msg | deleteflg | |----------------|---------------|-----------| | 02b00813bdf7 | Error A | 0 | | 02b00813bdf7 | Error B | 0 | | d7f5f66ff4da | Error C | 0 | | d7f5f66ff4da | Error C | 0 | 执行上述查询后,结果如下: | ansuid | error_msg | |----------------|------------------| | 02b00813bdf7 | Error A,Error B | | d7f5f66ff4da | Error C | #### 动态生成 IN 条件 在实际开发中,`IN` 子句中的值可以通过动态 SQL 生成。例如使用 MyBatis 的 `<foreach>` 标签: ```xml <foreach collection="list" index="index" item="item" open="(" separator="," close=")"> #{item} </foreach> ``` 此代码片段将列表中的值转换为逗号分隔的形式,供 SQL 查询使用[^2]。 #### 注意事项 - 如果拼接结果超出 `group_concat_max_len` 的限制,多余部分将被截断。 - `GROUP_CONCAT` 的性能可能受数据量和复杂度影响,在大数据量场景下需谨慎使用。 ### 示例代码 以下是一个完整的 SQL 示例,展示如何使用 `GROUP_CONCAT` 拼接字段内容: ```sql SELECT a.ansuid, GROUP_CONCAT(DISTINCT a.error_msg ORDER BY a.error_msg ASC SEPARATOR '|') AS error_msg FROM t_wjdc_answer_exception a WHERE a.deleteflg = '0' GROUP BY a.ansuid HAVING a.ansuid IN ('02b00813bdf7', 'd7f5f66ff4da'); ``` - `ORDER BY a.error_msg ASC`:按字母顺序排列拼接内容。 - `SEPARATOR '|'`:使用竖线作为分隔符。 ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值