SQL删除指定字段问题

更新下问题:
表:TBL_Info
字段:
    infoId int
    title  varchar(20)
    Content  text
    byUser  varchar(20)
    createTime datetime

1、如何删除表中数据相同的数据呢?(主键除外)
2、如何删除数据表中某个字段数据相同的数据呢(比如title:删除所有title相同的数据)?
3、如何统计表中title相同数据的数目?

 

--1 --1.1相同时保留最小的infoId
delete TBL_Info from TBL_Info t where infoId not in (select min(id) from infoId where title = t.title and Content = t.Content and byUser = t.byUser and createTime = t.createTime)
--1.1相同时保留最大的infoId
delete TBL_Info from TBL_Info t where infoId not in (select max(id) from infoId where title = t.title and Content = t.Content and byUser = t.byUser and createTime = t.createTime)

--2
delete from TBL_Info where title in (select title from TBL_Info group by title having count(1) > 1)

--3
select title , count(1) from TBL_Info group by title
select title , count(*) from TBL_Info group by title
select title , count(title) from TBL_Info group by title

 

 

--功能概述:删除重复记录

在几千条记录里,存在着些相同的记录,如何能用SQL语句,删除掉重复的呢?谢谢!
1、查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断
select * from people
where peopleId in (select  peopleId  from  people  group  by  peopleId  having  count(peopleId) > 1)

2、删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录
delete from people
where peopleId  in (select  peopleId  from people  group  by  peopleId  having  count(peopleId) > 1)
and rowid not in (select min(rowid) from  people  group by peopleId  having count(peopleId )>1)

3、查找表中多余的重复记录(多个字段)
select * from vitae a
where (a.peopleId,a.seq) in  (select peopleId,seq from vitae group by peopleId,seq  having count(*) > 1)

4、删除表中多余的重复记录(多个字段),只留有rowid最小的记录
delete from vitae a
where (a.peopleId,a.seq) in  (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)
and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)

5、查找表中多余的重复记录(多个字段),不包含rowid最小的记录
select * from vitae a
where (a.peopleId,a.seq) in  (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)
and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)

比方说在A表中存在一个字段“name”,而且不同记录之间的“name”值有可能会相同,
现在就是需要查询出在该表中的各记录之间,“name”值存在重复的项;
Select Name,Count(*) From A Group By Name Having Count(*) > 1

如果还查性别也相同大则如下:
Select Name,sex,Count(*) From A Group By Name,sex Having Count(*) > 1

 

 

http://topic.youkuaiyun.com/u/20091215/23/548d1982-7610-4d0f-8ddb-2150f7ae0589.html

<think>嗯,用户现在问的是在SQL中如何删除某些字段的重复数据。之前他们问过关于Pandas处理重复列的问题,现在转向了SQL,可能是在同的环境下处理数据。我需要先理解他们的需求。 首先,用户可能是在处理数据库中的数据,需要根据某些字段删除重复的行。这可能涉及到保留一条记录而删除其他重复项。常见的情况是数据导入或合并时产生了重复,需要清理。 接下来,我需要回忆SQL中处理重复数据的方法。通常,使用DELETE语句结合子查询或者窗口函数。比如ROW_NUMBER()来给重复的行编号,然后删除编号大于1的行。另一种方法是使用GROUP BY和MIN/MAX来保留特定的行,但这种方法可能更复杂,特别是在没有唯一标识符的情况下。 需要注意的是,同的数据库系统可能有同的语法,比如MySQL、PostgreSQLSQL Server在处理删除时的差异。用户可能没有指定具体的数据库,所以需要给出通用的方法,并提醒可能存在的变化。 另外,用户提到的“某些字段”意味着要根据多个字段来判断重复。比如,根据“姓名”和“年龄”组合是否重复,而其他字段可能同。这时候需要确保在窗口函数或子查询中正确指定这些字段。 还需要考虑事务处理,尤其是在生产环境中,删除操作前最好备份数据。此外,删除重复数据时,要明确保留哪一行,比如最早或最新的记录,或者根据某个排序条件来决定。 用户可能的深层需求是希望高效且安全地删除重复数据,同时保留必要的信息。可能需要给出多种方法,让他们根据具体情况选择。比如使用CTE加窗口函数的方法比较直观,而自连接的方法可能在数据量大时效率较低。 最后,需要提醒用户在实际操作前进行测试,避免误删数据。可能还需要考虑索引的存在与否,这会影响删除操作的性能。总结同的方法,并给出适用场景,帮助用户做出正确选择。</think>在SQL删除指定字段的重复数据主要有三种典型方法,以下是具体操作示例及适用场景: --- ### 方法一:窗口函数法(推荐) ```sql -- 通用标准语法(适用于PostgreSQL/MySQL 8+/SQL Server) WITH numbered AS ( SELECT *, ROW_NUMBER() OVER( PARTITION BY 字段1, 字段2 -- 指定判断重复的字段 ORDER BY 更新时间 DESC -- 按时间保留最新记录 ) AS rn FROM 表名 ) DELETE FROM numbered WHERE rn > 1; ``` **特点**: - 明确指定保留策略(保留第一条或最后一条) - 支持多字段组合判断(如`PARTITION BY name, phone`) - 可控制排序依据(时间戳、ID等) --- ### 方法二:自关联删除法 ```sql -- 适用于MySQL支持CTE的旧版本 DELETE t1 FROM 表名 t1 INNER JOIN 表名 t2 ON t1.字段1 = t2.字段1 AND t1.字段2 = t2.字段2 AND t1.id > t2.id; -- 假设有自增主键id ``` **特点**: - 依赖唯一标识字段 - 执行效率较低(大数据量时慎用) - 直观展示重复判断逻辑 --- ### 方法三:临时表重建法 ```sql -- 安全稳妥的通用方案 CREATE TABLE 新表 AS SELECT DISTINCT ON (字段1, 字段2) * -- PostgreSQL特有语法 FROM 原表 ORDER BY 字段1, 字段2, 更新时间 DESC; -- 或使用通用语法 CREATE TABLE 新表 AS SELECT * FROM ( SELECT *, ROW_NUMBER() OVER(PARTITION BY 字段1 ORDER BY id) rn FROM 原表 ) t WHERE rn = 1; DROP TABLE 原表; ALTER TABLE 新表 RENAME TO 原表; ``` **特点**: - 数据安全系数最高 - 适用于关键生产数据 - 需要重建索引等对象 --- ### 注意事项 1. **备份先行**:执行前务必`CREATE TABLE 备份表 AS SELECT * FROM 原表` 2. **索引优化**:在判断重复的字段上创建索引可大幅提升性能 3. **复合条件**:实际业务中常需要同时满足多个字段重复(如姓名+手机号) 4. **去重策略**: - 保留最早记录:`ORDER BY create_time ASC` - 保留最新记录:`ORDER BY update_time DESC` - 保留完整度最高的记录:结合COALESCE函数判断 **示例:复杂去重逻辑** ```sql -- 保留非空字段最多的记录 WITH ranked AS ( SELECT *, ROW_NUMBER() OVER( PARTITION BY user_id ORDER BY (CASE WHEN address IS NOT NULL THEN 1 ELSE 0 END + CASE WHEN email IS NOT NULL THEN 1 ELSE 0 END) DESC, update_time DESC ) AS rk FROM users ) DELETE FROM ranked WHERE rk > 1; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值