免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: tigerfish
打印 上一主题 下一主题

求删除重复记录的sql语句? [复制链接]

论坛徽章:
0
41 [报告]
发表于 2004-06-10 14:45 |只看该作者
有这么多好办法,值得学习。

论坛徽章:
0
42 [报告]
发表于 2004-06-11 11:47 |只看该作者

老大!写错了吧?

最初由 ccwlm741212 发布
[B]算了,今天开心哦 给出一个完整的解决方案:

将重复的记录记入temp1表:
   select [标志字段id],count(*) into temp1 from [表名]
   group by [标志字段id]
   having count(*)>1

2、将不重复的记录记入temp1表:
   insert temp1
   select [标志字段id],count(*) from [表名]
   group by [标志字段id]
   having count(*)=1

3、作一个包含所有不重复记录的表:
   select * into temp2 from [表名]
   where 标志字段id in(select 标志字段id from temp1)

4、删除重复表:
   delete [表名]

5、恢复表:
   insert [表名]
   select * from temp2

6、删除临时表:
   drop table temp1
   drop table temp2 [/B]

你的sql批处理有问题!
你可以测测!

论坛徽章:
0
43 [报告]
发表于 2004-06-11 12:19 |只看该作者

删除重复数据

删除重复数据

一、具有主键的情况
a.具有唯一性的字段id(为唯一主键)
delete table
where id not in
(
select max(id) from table group by col1,col2,col3...
)
group by 子句后跟的字段就是你用来判断重复的条件,如只有col1,
那么只要col1字段内容相同即表示记录相同。

b.具有联合主键
假设col1+\',\'+col2+\',\'...col5 为联合主键
select * from  table where col1+\',\'+col2+\',\'...col5 in (
  select max(col1+\',\'+col2+\',\'...col5) from table
where having count(*)>1
group by col1,col2,col3,col4
)
group by 子句后跟的字段就是你用来判断重复的条件,
如只有col1,那么只要col1字段内容相同即表示记录相同。

c:判断所有的字段
  select * into #aa from table group by id1,id2,....
  delete table
  insert into table
  select * from #aa

二、没有主键的情况

a:用临时表实现
select identity(int,1,1) as id,* into #temp from ta
delete #temp
where id not in
(
  select max(id) from # group by col1,col2,col3...
)
delete table ta
inset into ta(...)
   select ..... from #temp

b:用改变表结构(加一个唯一字段)来实现
alter table 表 add  newfield int identity(1,1)
delete 表
where newfield not in
(
select min(newfield) from 表 group by 除newfield外的所有字段
)

alter table 表 drop column newfield

论坛徽章:
0
44 [报告]
发表于 2004-07-09 16:12 |只看该作者

xzh2000兄的存储过程出现问题出现

xzh2000兄的存储过程出现问题出现   名为 \'cur_rows\' 的游标已存在。
服务器: 消息 16915,级别 16,状态 1,行 1

论坛徽章:
0
45 [报告]
发表于 2004-07-09 22:04 |只看该作者
呵呵, 最近刚好遇到一个类似的问题, 是一组海量数据,
主要字段有两个: ID1和ID2, 其中ID1为主键, 而ID2也要求不能重复(即候补主键)
表中有数据七十万, 更新操作通过CSV文件做批量处理, 文件一般在二十万件左右
处理时, 要对文件中的每一条数据进行检查, 如果表中有相同的ID1和ID2则更新数据, 如果表中没有ID1和ID2则追加, 如果表中的ID1和ID2只有一个和文件中相同则将该记录写如错误记录表, 不对原表做更新,
为了提高处理效率, 偶将文件中的二十万条数据先直接存进临时表, 于是问题就变成了对两个表的处理, 直接的想法是从临时表中取出一条数据, 和目标表做比较, 这种做法需要六个小时(双3.06G CPU 4G内存), 因此考虑做优化, 通过对目标表中的ID做唯一制约, 将处理时间缩短到30分, 但仍然不能接受, 于是考虑不使用游标来完成的方法
首先, 要去掉临时表中关系有错误的记录
SELECT * FROM TEMP T
WHERE EXISTS(SELECT NULL FROM TEMP WHERE
TEMP.ID1= T.ID1 AND TEMP.ID2<>T.ID2)
然后, 去掉临时表中和目标表的关系有错误的记录
SELECT * FROM TEMP
WHERE EXISTS(SELECT NULL FROM TARGET WHERE
TEMP.ID1= TARGET.ID1 AND TARGE.ID2<>TARGET.ID2)
对目标表做追加(只追加主键然后做更新, 否则还要判断临时表中键值相同的记录)
SELECT DISTINCT ID1, ID2 FROM TEMP
WHERE EXISTS(SELECT NULL FROM TARGET WHERE
TEMP.ID1= TARGET.ID1)
更新目标表(这里用到了PGSQL的语法)
UPDATE TARGET
SET TARGET.* = TEMP.*
FROM TEMP
WHERE TARGET.ID1=TEMP.ID1

这样做的结果和使用游标的差不多, 甚至还要长一些, 经分析, 主要时间都花在第一个SQL文上了,
这是很麻烦的一件事, 临时表上不方便建立索性之类的东西, 因为它的主要作用是暂存数据并利用它对海量数据进行检查,
于是考虑使用下面的SQL文(看上去怪怪的, 呵呵)
DELETE TEMP
WHERE (ID2, ID1) IN
(SELECT DISTINCT ID2, ID1 FROM TEMP
MINUS
SELECT ID2, MIN(ID1) FROM TEMP GROUP BY ID2)
上面这段SQL文把有问题的数据保留了一条, 由于没有破坏要求的关系, 因此可以接受, 同时它把根据ID1来检查ID2的工作留给了下面的处理,
经过这样的改造, 完成全部处理所需时间只有六秒钟, 嘿嘿

论坛徽章:
0
46 [报告]
发表于 2004-07-09 22:26 |只看该作者
, 临时表上不方便建立索性之类的东西
---------------------------------------------------------------------------------------

没有这个说法

论坛徽章:
0
47 [报告]
发表于 2004-07-09 22:31 |只看该作者
最初由 花好月不圆 发布
[B], 临时表上不方便建立索性之类的东西
---------------------------------------------------------------------------------------

没有这个说法 [/B]

大概是偶没有说清楚, 因为需要对数据关系进行检查, 并写出完整的LOG信息, 所以不方便给临时表建立索引, 使得数据不整合的问题在在被检出和处理之前就引起程序的错误

论坛徽章:
0
48 [报告]
发表于 2004-07-13 10:13 |只看该作者
--取重复数据
select count(bus_code),BUS_CODE,TRN_NO,TRN_Date,TRN_TYPE,TRN_EMPLOYEE,TRN_PRODUCT,TRD_DESTINV,TRD_DESTLOCATOR,TRD_UNIT_CODE,TRD_REASON,TRD_LOTNUM,TRD_QUANTITY,TRD_SUCCEED,ErrorDis
from TBLExcel
group by BUS_CODE,TRN_NO,TRN_Date,TRN_TYPE,TRN_EMPLOYEE,TRN_PRODUCT,TRD_DESTINV,TRD_DESTLOCATOR,TRD_UNIT_CODE,TRD_REASON,TRD_LOTNUM,TRD_QUANTITY,TRD_SUCCEED,ErrorDis
having count(bus_code) >= 2

--删除重复数据
select distinct * into tblexcel_dis from  tblexcel
delete tblexcel
insert tblexcel select * from tblexcel_dis
drop table tblexcel_dis

论坛徽章:
0
49 [报告]
发表于 2004-08-01 07:19 |只看该作者
楼上的,我也遇到了相似的问题,如果是表中有完全相同的几条记录,我要删去相同的,流下一条,而且,我的数据量挺大,用你的DISTINCT方法,能不能改一下,让运行速度更快,

论坛徽章:
0
50 [报告]
发表于 2004-08-01 07:21 |只看该作者
是这几条记录的所有字段都完全一样,怎么写语句更好,
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP