用SQL保证数据唯一性的问题?
我有一张海量数据的表,由于设计时没有设定主键,发现有很多重复的数据,请问如何用一条(几条)SQL语句删除重复的数据,即多条重复数据只保留一条。
重谢!
问题点数:30、回复次数:14Top
1 楼WangZWang(先来)回复于 2005-08-01 16:50:13 得分 0
select * into xxx
from 表名
delete 表名
insert into 表名
select * from xxx
drop table xxxTop
2 楼WangZWang(先来)回复于 2005-08-01 16:51:50 得分 0
--第一行改为
select distinct * into xxx
from 表名Top
3 楼hzxiaofeng()回复于 2005-08-01 16:54:04 得分 0
支持楼上的Top
4 楼tjficcbw(津津)回复于 2005-08-01 17:03:35 得分 2
select * into 新表 from 旧表 where 字段名a in (select top 1 字段名a from 表名 group by 字段名a)Top
5 楼tjficcbw(津津)回复于 2005-08-01 17:04:23 得分 0
select * into 新表 from 旧表 where 字段名a in (select top 1 字段名a from 表名 group by 字段名a)Top
6 楼LSL_winnie(麒麟)回复于 2005-08-01 17:29:07 得分 10
CREATE procedure DeleteUser AS
begin
declare @dnIndex numeric, --索引号
@dcOldUserNum varchar(21), --上次用户手机号
@dcNewUserNum varchar(21) --本次用户手机号
declare DELETE_Cursor cursor for
select dIndex,UserNum from TABLE1 order by userNum
open DELETE_Cursor fetch next from DELETE_Cursor into @dnIndex,@dcNewUserNum
while @@FETCH_STATUS = 0
begin
if (@dcNewUserNum = @dcOldUserNum)
delete from table1 where dIndex=@dnIndex
else
select @dcOldUserNum=@dcNewUserNum
end
fetch next from DELETE_Cursor into @dnIndex,@dcNewUserNum
end
close DELETE_Cursor
deallocate DELETE_Cursor
end
GO
--exec DeleteUserTop
7 楼LSL_winnie(麒麟)回复于 2005-08-01 17:37:19 得分 0
1楼效率是个问题,搂主说了是海量数据,tjficcbw(津津) 你的好像不行呀。Top
8 楼sy251216(sy)回复于 2005-08-01 18:29:44 得分 0
怎么在原表中实现那?不要老是去做到新表里去。我试了很多办法做不到Top
9 楼junly1981(浪子心声)回复于 2005-08-01 20:10:54 得分 0
同意楼上:WangZWang(阿来) 的,选排除重复项的方法,插入到另一表,然后清除完原表,再导回来就OK了Top
10 楼bugchen888(臭虫)回复于 2005-08-01 20:34:08 得分 0
WangZWang(阿来)是个不错的解决方案.Top
11 楼MorningTea(一勺抹茶)回复于 2005-08-01 20:53:28 得分 15
大家回答那么多,感觉重复应该有2种情况。是所有字段相同,还只是某些字段重复
1.如果是所有字段重复,那么就是用
回复人: WangZWang(阿来) ( ) 信誉:100 2005-08-01 16:50:00 得分: 0
select distinct * into xxx
from 表名
delete 表名
insert into 表名
select * from xxx
drop table xxx
2。如果只是某些字段重复,那么就是 tjficcbw(津津)所认为的情况,他知道那么一回事,但是代码没有实现,实际会把所有的资料都导到临时表
3. 回复人: LSL_winnie(麒麟) ( ) 信誉:100 2005-08-01 17:37:00 得分: 0
1楼效率是个问题,搂主说了是海量数据,tjficcbw(津津) 你的好像不行呀。
我觉得WangZWang(阿来)得很好,因为你是海量,也没有办法的,你整合过一次,设立主键维护,那
么不就是ok的吗,然后好好维护,资料过多就备份,这样资料库服务器才不会挂了~~
tjficcbw(津津)的不是不行,而是也有情况是某列栏位重复就认为是重复,不过按照楼主说因为没有加上key值而导致的重复,那么tjficcbw(津津)认为的情况不存在,如果是存在,那么那个字段名a 不就是key值了吗?这样情况可以,用临时表,并且加上identity(),假设栏位为nam
select identity(int,1,1) as sn ,* into #T from 表
--所有纪录插入临时表#T,并且每一条加上序号sn
select ColNam2,ColNam3,...,ColNamN--除了序号sn
from #T T
where not exists (select T1.nam from #T T1 where T1.nam = T.nam
and T.sn <T1.sn )Top
12 楼tntzbzc(华裔大魔王—抗日要从娃娃抓起)回复于 2005-08-01 23:59:17 得分 2
问1楼
如果是海量数据,在执行插入临时表可能会超时或崩溃。超时会导致SQL2K自动枪毙操作,这时应该怎么办?Top
13 楼WangZWang(先来)回复于 2005-08-02 08:57:04 得分 0
把设置超时的时间为无限制即设置为0, 然后暂时把表的所有索引屏蔽掉,执行操作.Top
14 楼fiele(半导体)回复于 2005-08-02 09:55:50 得分 1
select distinct * into 新表 from 旧表
delete from 旧表
insert into 旧表
select * from 新表Top




