SQLServer删除重复数据记录

本文总结了在SQLServer2000中删除重复数据的方法,包括有主键和无主键两种情况。对于具有唯一主键或联合主键的表,可以使用GROUP BY语句结合删除操作;如果没有主键,可以通过创建临时表或添加唯一字段的方式来删除重复记录。

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

*******************************************
SQLServer2000删除重复数据(总结)
*******************************************

 
一、具有主键的情况
 
I.具有唯一性的字段id(为唯一主键) 

delete  用户表    
where  id  not  in    
(  
select  max(id)  from  用户表  group  by  col1,col2,col3...  
)  


group  by  子句后跟的字段就是你用来判断重复的条件,如只有col1, 
那么只要col1字段内容相同即表示记录相同。 
 
II.具有联合主键
 
假设col1+','+col2+','...col5  为联合主键

(找出相同记录)

select  *  from    用户表  where  col1+','+col2+','...col5  in  
(  
  
select  max(col1+','+col2+','...col5)  from  用户表    
  
group  by  col1,col2,col3,col4
  
having  count(*)>1     
)  


group  by  子句后跟的字段就是你用来判断重复的条件, 
如只有col1,那么只要col1字段内容相同即表示记录相同。 
 
或者:
(找出相同记录)

select  *  from  用户表  where  exists  (select  1  from  用户表  x  where  用户表.col1 =  x.col1  and    
用户表.col2
=  x.col2  group  by  x.col1,x.col2  having  count(*)  >1)  


 
III:判断所有的字段 

   select  *  into  #aa  from  用户表  group  by  id1,id2,....  
   
delete  用户表    
   
insert  into  用户表 select  *  from  #aa  


 
二、没有主键的情况 
 
I.用临时表实现 

select  identity(int,1,1)  as  id,*  into  #temp  from  用户表  
delete  #temp    
where  id  not  in    
(  
   
select  max(id)  from  #  group  by  col1,col2,col3...  
)  
delete  用户表  ta  
inset  
into  ta(...) select  .....  from  #temp  

 
II.用改变表结构(加一个唯一字段)来实现

alter  用户表  add    newfield  int  identity(1,1)  
delete  用户表  
where  newfield  not  in  
(  
select  min(newfield)  from  用户表  group  by  除newfield外的所有字段  
)  
alter  用户表  drop  column  newfield


 

### SQL Server 中去除重复数据的方法 在 SQL Server 中,可以使用 `DISTINCT` 和 `GROUP BY` 来实现去重操作。以下是两种方法的具体说明以及示例。 #### 使用 DISTINCT 进行去重 `DISTINCT` 是一种简单有效的方式,用于返回唯一的不同值组合。它适用于只需要获取不重复记录的情况。 ```sql -- 对 COUNTRY 字段进行去重查询 SELECT DISTINCT COUNTRY FROM psur_list; [^1] ``` 此语句会从表 `psur_list` 的 `COUNTRY` 列中提取唯一的国家名称列表。 #### 使用 GROUP BY 进行去重 当需要对某些列分组并进一步处理时(例如聚合),可以选择 `GROUP BY`。如果仅是为了去重而无需额外计算,则性能可能会因具体情况有所不同[^2]。 ```sql -- 使用 GROUP BY 实现与上述 DISTINCT 类似的功能 SELECT COUNTRY FROM psur_list GROUP BY COUNTRY; ``` 需要注意的是,在实际应用过程中,应考虑执行计划来决定哪种方式更适合当前场景。对于复杂查询或者大数据量环境下的表现差异尤为明显。 另外还提到了窗口函数 ROW_NUMBER() 可作为另一种解决方案之一: ```sql WITH RankedData AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY COUNTRY ORDER BY (SELECT NULL)) AS RowNum FROM psur_list ) SELECT * FROM RankedData WHERE RowNum = 1; ``` 以上代码通过分配给每组内的每一行编号,并选取第一个实例完成去重目的。 关于错误提示部分提到 MySQL 查询失败案例是因为尝试按照未选定字段排序违反标准语法规定所致[^3];而在 SQL Server 上构建相应正确形式如下所示: ```sql -- 正确写法示范 SELECT COUNT(*), songid, MAX(new_time) as latest_new_time -- 添加必要的汇总运算符 FROM feedback GROUP BY songid ; ``` 这里我们假设希望按歌曲 ID 统计反馈次数的同时保留最新时间戳信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值