挑战高手:SQL Server 2000, 一个表, 包含完全相同重复数据若干,怎么删除多余记录?

happyer 2001-09-01 11:03:30
比如:
字段名: Col_A Col_B Col_C
记录: A A A
A A    A
B C D
A A A
B C D
B D D
A A A

反正就是有完全相同记录!
现在要留下完全相同记录中的一条,仅留一条,其余删除。
结果是:
字段名: Col_A Col_B Col_C
记录: A A A
B C D
B D D
要求语句尽量简洁,一定要高效!
尽管放马过来吧。
...全文
412 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
happyer 2001-09-03
  • 打赏
  • 举报
回复
TO Billie_li:
也有道理!
好,结束这个话题,给分喽!
general2000 2001-09-02
  • 打赏
  • 举报
回复
to: KingSunSha(弱水三千) 

从几次您回答的问题来看,我发现您对ORACLE的ROWID AND ROWNUM 理解的特别的深,而且应用自如!我得向你学习一下!!!!

能不能给个QQ号??
Billie_li 2001-09-02
  • 打赏
  • 举报
回复
不如在你生成这些行时就检查有无重复行,可以用触发器啊
KingSunSha 2001-09-02
  • 打赏
  • 举报
回复
general2000(大小统吃):
我的QQ号:26357609(需要验证)
happyer 2001-09-01
  • 打赏
  • 举报
回复

csdn藏龙卧虎,我相信一定能够搞定这个问题的!
时间问题。

我等等等等等等等等等等等等等等等等等等等等等等等!

happyer 2001-09-01
  • 打赏
  • 举报
回复
看来还是要复制啊!
摩西,你的办法已经不错了!
不过还是不满足要求。
leeyoong 2001-09-01
  • 打赏
  • 举报
回复
select distinct * into table_b from table_a
go
drop table table_a
go
sp_rename table_b,table_a
go
happyer 2001-09-01
  • 打赏
  • 举报
回复
没有ID,确实没有。
结构完全相同。
不是没事干为难大家。
确实不好搞定。
高人都来啊!
zhangshzh 2001-09-01
  • 打赏
  • 举报
回复
如果表结构跟你贴出来的结构完全一样,我想实现可能比较困难,但你的数据表中有一个iden或其它的主键字段话则有办法。
lovesong 2001-09-01
  • 打赏
  • 举报
回复
关注。
happyer 2001-09-01
  • 打赏
  • 举报
回复
我说的是 insert 这个动作磁盘I/O操作太大。
虽然调用存储过程,就算你存储过程可以反复调用,还是要进行insert操作的。
能不能直接删除多余的?
能够直接delete就快多了。
你开始说出的这个办法我会,不过就是感觉慢。
求解决方案!
lovesong 2001-09-01
  • 打赏
  • 举报
回复
不是阿,insert into了以后建立的table_b是永久的了。下面这个proc一次就搞定了。
create procedure sp_cleardata
as
begin
begin tran
insert into table b select distinct * from table_a
commit tran
begin tran
delete from table_a
commit tran

begin tran
insert into table a select * from table_b
commit tran
end



happyer 2001-09-01
  • 打赏
  • 举报
回复
没有更快的办法?
这样还得建一个表,再删一个表,而且,把表中数据几乎都复制了一遍。
但是,我这个表中有50万条记录(不包括重复!),而且,有若干表都是这样。
你难道要我都copy一次?再删除一次?
lovesong 2001-09-01
  • 打赏
  • 举报
回复
这种表结构怎么高效的起来?
写存储过程:
原来的表名:table_a
先insert into table b select distinct * from table_a (会产生一个和table_a结构相同的表)
然后
delete from table_a;
最后
insert into table_a select * from table_b
happyer 2001-09-01
  • 打赏
  • 举报
回复
今天晚上人多。UP.
happyer 2001-09-01
  • 打赏
  • 举报
回复
原来如此。(错怪---我错了,我是妖怪)
Alpha1997 2001-09-01
  • 打赏
  • 举报
回复
to :happyer(编程的兔子) 
RowID是Oracle的伪例,对于每一个表,系统自建的
对于Oracle,我认为KingSunSha的方法很不错
happyer 2001-09-01
  • 打赏
  • 举报
回复
TO KingSunSha(弱水三千):
我这个表没有ID,所以你那个max(rowid)不知道是否有用
而且重复记录是“完全重复”,而且不知道重复次数。你看看本贴最前面例子。
所以,好像不行啊。
TO leeyoong(莫西):
不带外键好像不可能啊。
我这里这么多表,肯定有一个表管理这些表的。(记录表名以及其功能,内容的分类……)
现在已经不恐怖了。我是说 你原来没有提及事务处理。

视图?你突然提到这件事,我牙齿还没刷呢!
你是说用视图得到结果,而不需要实际处理重复值?
那样以后冗余越来越多啊。
可能理解偏差,望明告之。
KingSunSha 2001-09-01
  • 打赏
  • 举报
回复
ORACLE中是非常容易解决的,用ROWID就行了。
delect from mytable x
where rowid <> (select max(rowid)
from mytable y
where y.field1 = x.field1
and y.field2 = x.field2
.....
);

在SQL SERVER中有没有类似的方法?
leeyoong 2001-09-01
  • 打赏
  • 举报
回复
使用drop table的命令,仅针对一个独立的表,该表不可带外键连接和触发器等。

在这之前可以先提交数据写入新表的操作,成功建立新表后,那么再drop旧表,就没什么恐怖了!~

另外,对你的要求,我觉得还不如建立一系列的视图来得轻松,又无须大量的insert操作!提高效率又节省空间!不知意下如何?
加载更多回复(6)

34,593

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧