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

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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删除重复记录或选择唯一数据 #### 删除重复记录 在关系型数据库中,可以通过多种方式删除表中的重复记录。以下是几种常见的方式: 1. **MySQL 中删除重复记录并保留一条** 使用自连接的方法可以有效地删除重复记录,并仅保留每组重复记录中 `id` 最小的一条记录[^1]。 ```sql DELETE t1 FROM your_table t1 INNER JOIN your_table t2 ON t1.name = t2.name AND t1.id > t2.id; ``` 2. **Oracle 数据库中删除重复记录** Oracle 提供了 `ROWID` 属性作为每一行的唯一标识符。利用此属性,可以选择性地删除重复记录,同时保留一组重复记录中某一行的数据[^2]。 ```sql DELETE FROM your_table WHERE ROWID NOT IN ( SELECT MIN(ROWID) FROM your_table GROUP BY column1, column2, ..., columnN ); ``` 3. **SQL Server 中删除重复记录** 对于 SQL Server,可以通过创建临时表的方式来实现去重操作。具体做法是先将无重复记录的结果存入临时表,随后替换原表的内容[^3]。 ```sql -- 创建临时表存储无重复记录 SELECT DISTINCT * INTO #TempTable FROM your_table; -- 清空原表 TRUNCATE TABLE your_table; -- 将临时表内容重新导入到原表 INSERT INTO your_table SELECT * FROM #TempTable; -- 删除临时表 DROP TABLE #TempTable; ``` 4. **通用方法:基于主键删除重复记录** 借助分组查询和子查询技术,可以从任意支持标准 SQL 的数据库中删除重复记录。以下是一个适用于大多数数据库系统的解决方案[^4]。 ```sql DELETE FROM your_table WHERE id NOT IN ( SELECT MIN(id) FROM your_table GROUP BY name, login_date ); ``` 5. **复杂条件下的重复记录删除** 当需要根据多个字段组合判断重复时,可以扩展上述逻辑以适应更复杂的场景[^5]。 ```sql DELETE FROM lib WHERE (`name`, version) IN ( SELECT t.`name`, t.version FROM ( SELECT `name`, version FROM lib GROUP BY `name`, version HAVING COUNT(*) > 1 ) t ) AND id NOT IN ( SELECT dt.minid FROM ( SELECT MIN(id) AS minid FROM lib GROUP BY `name`, version HAVING COUNT(*) > 1 ) dt ); ``` #### 查询唯一数据 如果只需查询不带重复项的数据而不修改实际表格,则可采用如下方法: - 利用 `DISTINCT` 关键字返回指定列的不同值集合[^3]。 ```sql SELECT DISTINCT column_name(s) FROM table_name; ``` - 或者通过聚合函数配合 `GROUP BY` 子句完成相同目标。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值