在SQL中删除重复记录(多种方法)

在大的数据库应用中,经常因为各种原因遇到重复的记录,造成数据的冗余和维护上的不便。

1.用rowid方法

2.用group by方法

3.用distinct方法

1。用rowid方法

据据oracle带的rowid属性,进行判断,是否存在重复,语句如下:

查数据:

    select * from table1 a where rowid not in(select  max(rowid) 

    from table1 b where a.name1=b.name1 and a.name2=b.name2......)

删数据:

   delete  from table1 a where rowid not in(select  max(rowid) 

    from table1 b where a.name1=b.name1 and a.name2=b.name2......)

2.group by方法

查数据:

  select count(num), max(name) from student --列出重复的记录数,并列出他的name属性

  group by num

  having count(num) >1 --按num分组后找出表中num列重复,即出现次数大于一次

删数据:

  delete from student

  group by num

  having count(num) >1

  这样的话就把所有重复的都删除了。

3.用distinct方法 -对于小的表比较有用

create table table_new as  select distinct *  from table1 minux

truncate table table1;

insert into table1 select * from table_new;

例子:
假如有表A(a0,a1,a2,a3)分别表示序号,姓名,科目,分数
a0   a1    a2    a3
  张三   语文  80
  李四   语文  82
  张三   语文  80
  王五   语文  92
  张三   数学  65
  李四   数学  88
  张三   数学  65
  王五   数学  90
  二麻子 语文  86
10  二麻子 数学  89
我现在要:
1,查出姓名,科目,分数相同的记录,语句怎么写呢?
2,删出姓名,科目,分数相同的记录,语句怎么写呢?
3,查出同一个人,语文数学都超过80分,但是只能找出语文数学总分之后最小的那一个,语句           怎么写呢?

最佳答案

1.查出姓名,科目,分数相同的记录
select * from A as out
where exists(select * from 
(select a1,a2,a3 from A group by a1,a2,a3 having count(*) > 1) as b
where a1 = out.a1 and a2 = out.a2 and a3 = out.a3)

2. 删出姓名,科目,分数相同的记录(这里应该是重复的记录只保留一条吧)
delete from A
where exists(
select * from
(select a1,a2,a3,min(a0) as min_id from A as b
group by a1,a2,a3 having count(*) > 1) as c
where a1 = A.a1 and a2 = A.a2 and a3 = A.a3 and A.a0 > min_id)

3.查出同一个人,语文数学都超过80分,但是只能找出语文数学总分之后最小的那一个
select top 1 a1, ttl from
(select a1,sum(a3) as ttl  from A where a2 in (N'语文',N'数学') and a3 > 80
group by a1 having count(*) = 2 ) as b
order by ttl
SQL Server多种方法可以高效地删除重复记录,通常使用的是聚集索引或其他唯一约束来识别唯一的行。这里有几个常见的策略: 1. **使用`DISTINCT`关键字**: 如果你知道要删除哪些列,你可以先创建一个临时表或视图,只包含不重复的组合,然后从原始表删除非唯一项。 ```sql DELETE T1 FROM YourTable T1 WHERE NOT EXISTS (SELECT 1 FROM ( SELECT DISTINCT Column1, Column2, ... FROM YourTable ) T2 WHERE T1.Column1 = T2.Column1 AND T1.Column2 = T2.Column2); ``` 2. **使用`GROUP BY`和`HAVING`**: 这种方法通过分组并检查每个组的数量来找重复行,如果某个组有超过1条记录,则删除所有除了第一条之外的记录。 ```sql DELETE YourTable WHERE ID NOT IN ( SELECT MIN(ID) FROM YourTable GROUP BY Column1, Column2, ... HAVING COUNT(*) > 1 ); ``` 3. **利用`ROW_NUMBER()`窗口函数**: 如果你的数据库支持窗口函数,可以按照指定列排序,并保留每组的第一条记录。 ```sql WITH CTE AS ( SELECT *, ROW_NUMBER() OVER(PARTITION BY Column1, Column2, ... ORDER BY (SELECT NULL)) RN FROM YourTable ) DELETE FROM CTE WHERE RN > 1; ``` 4. **考虑使用分区**: 对于非常大的表,可以考虑按特定列分区,然后再分别处理每个分区内的重复记录。 无论哪种方法,都要谨慎操作,尤其是当数据量大时,因为删除操作通常是不可逆的。建议在实际操作前备份数据,并在测试环境验证。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值