如何用一条语句删除数据库中重复的记录?

javawoai 2005-09-19 05:37:32
如何用一条语句删除数据库中重复的记录?
...全文
532 点赞 收藏 16
写回复
16 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
fallingstarNo1 2005-10-11
如果要是有100列怎么办???????????
回复
华芸智森 2005-10-10
create table TAB1
(
FLD1 VARCHAR(32),
FLD2 VARCHAR(32),
FLD3 VARCHAR(32)
)


GO

INSERT INTO TAB1 (FLD1,FLD2,FLD3) VALUES('1','A','A')
INSERT INTO TAB1 (FLD1,FLD2,FLD3) VALUES('2','B','B')
INSERT INTO TAB1 (FLD1,FLD2,FLD3) VALUES('3','B','B')
INSERT INTO TAB1 (FLD1,FLD2,FLD3) VALUES('4','C','C')

GO

SELECT * FROM TAB1

GO

DELETE FROM TAB1 WHERE FLD1 IN (SELECT B.FLD1 FROM TAB1 AS A LEFT JOIN TAB1 AS B ON A.FLD1>B.FLD1 AND A.FLD2=B.FLD2)

GO

SELECT * FROM TAB1
回复
华芸智森 2005-10-08
说明一下:表TAB3 .
FLD1是主键.删除FLD2多余的记录.

DELETE FROM TAB3 WHERE FLD1 IN (SELECT B.FLD1 FROM TAB3 AS A LEFT JOIN TAB3 AS B ON A.FLD1>B.FLD1 AND A.FLD2=B.FLD2)
回复
zxbyhcsdn 2005-10-08
比如:
fld1
1
2
2
2
3
就会弄成

1
3

但是楼主的意思应该是
1
2
3
回复
zxbyhcsdn 2005-10-08
lizhaogui() 的
删数据:
  delete from student
  group by num
  having count(num) >1

好像会把出现重复的数据都删掉!!

比如:
fld1
1
2
2
2
3
就会弄成

1
3

但是楼主的意思应该是
1
2
3
4


回复
zxbyhcsdn 2005-10-08
delete ICYYMX where id not in
(SELECT min(ID)
FROM ICYYMX
group by strcph,dtscrq,dtscsj
)
回复
$扫地僧$ 2005-10-08
方法1:
--简单的方法就是借用临时表
--方式:把数据首先放到临时表
--在临时表中处理重复记录问题.
--删除物理数据表
--从临时表把数据取出来,放入物理表中
--删除临时表
Select distinct * into #temp from table1

delete table1

insert into table1
Select * from #temp

drop table #temp

方法2:
--方式2:
delete 表名
from 表名 tt
where exists(select 1 from 表名 where 字段=tt.字段 and 字段=tt.字段 and 主键<tt.主键)


方法3
--保留最小的ID
delete 表 where ID not in(select min(ID) from 表 group by 字段...(注:重复的字段行))
回复
MorningTea 2005-09-28
不用语句,但是速度很优!

举例:
表:TableA
id customer PhoneNo

表为TableA,customer重复则为重复,需要保留一笔即可
建立一张具有和TableA相同结构的临时表myTableA,单击鼠标右键,选择所有任务,选择管理索引,选择新建,起个索引名字,列就是customer,建立一个索引,勾选上唯一(unique),勾选上忽略重复的值,其他不要选择!然后把资料insert into到临时表,
此时SQL Server会返回如下提示:
  服务器: 消息 3604,级别 16,状态 1,行 1
  已忽略重复的键。
  它表明在产品信息临时表myTableA中不会有重复的行出现。

然后将原表TableA清空,并将临时表myTableA中数据导入,最后删除临时表myTableA。
这样就完成了对表中重复记录的删除。该方法的执行速度都是相当快的,而且因为几乎不用写语句,所以它也是很安全的。不过要依靠你的customer,万一你操作不当,没有关系,不要那么急着删除原来的表,这样不会出什么异常,错删除纪录!
回复
华芸智森 2005-09-28
用 MAX,MIN 来删除多余的数据是不可行的.当然,如果仅仅多余一条可以.但是,如果多余的有N条.删除就不完整了.
回复
NOKIA_LIU 2005-09-28
希望更多这样的帖子。更希望更多象lizhaogui() 这样全面回答问题的同志。。
顶一下!
回复
华芸智森 2005-09-28
?? :)

DELETE FROM TAB3 WHERE FLD1 IN (SELECT B.FLD1 FROM TAB3 AS A LEFT JOIN TAB3 AS B ON A.FLD1>B.FLD1 AND A.FLD2=B.FLD2)
回复
kisshere 2005-09-27
用rowid方法?
Is there rowid in sqlserver?
回复
LGame 2005-09-27
高人~~
回复
smin1994 2005-09-27
mark
回复
lisiyong 2005-09-20
同意楼上的方法 很全面
回复
lizhaogui 2005-09-19

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

1.用rowid方法

2.用group by方法

3.用distinct方法



1。用rowid方法

据据oracle带的rowid属性,进行判断,是否存在重复,语句如下:
查数据:
select * from table1 a where rowid !=(select max(rowid)
from table1 b where a.name1=b.name1 and a.name2=b.name2......)
删数据:
delete from table1 a where rowid !=(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;

回复
发帖
应用实例
创建于2007-09-28

2.7w+

社区成员

MS-SQL Server 应用实例
申请成为版主
帖子事件
创建了帖子
2005-09-19 05:37
社区公告
暂无公告