sql请教 关于筛选并删除重复记录的问题
发布网友
发布时间:2022-04-11 17:55
我来回答
共2个回答
热心网友
时间:2022-04-11 19:24
//--按你的描述,建立了表,并插入以上数据。以下语句是从我的环境中复制过来的,执行没问题,我的环境:SQLAnywhere数据库(语法同Sybase)
//---------------------------------------------------------------
//--1,查出完全重复的记录是哪些:
select *,count(a) from tr
group by a,b,c
having count(*) > 1;
//--返回值举例:
a........b........c......重复次数(数值是几就代表有几条完全相同的记录)
1001...1.....20.....3
1002...2.....50.....2
//---------------------------------------------------------------
//--2,显示字段a重复的所有记录:
select * from tr where a in (
select a from tr
group by a
having count(*) > 1)
order by a;
//--返回值不必举例了,只要是a字段重复的就都列出来了
//---------------------------------------------------------------
//--保持数据唯一性的处理(两个方式):
A、(只是画个框框,描述一下,但此方法效率绝对极低,且会占用很大系统资源)写个过程,定义游标,根据字段a的值检查全表,统计出重复的条数,再建立循环进行逐条删除,当循环执行到“该字段的重复记录数-1”时,跳出循环,游标取字段a的下一个欲处理的值
B、创建一个临时表(如tr_1),表结构同原表tr,将tr表中完全不重复的数据检索并插入到“克隆”表tr_1里,再清空tr表,最后将tr_1中的数据全部导入到tr表。
insert into tr_1 //--①--将记录不重复的插入tr_1表(该表须自行建立哦)
select distinct a,b,c from tr;
delete tr; //--②--删除tr表的全部数据
insert into tr
select * from tr_1; //--③--将tr_1表的数据插入回tr表
//--PS:当然了,你也可以用select distinct a,b,c from tr;查出不重复的记录,然后导出到记事本啊什么的,清空tr表之后,再将记事本中的数据导入。
热心网友
时间:2022-04-11 20:42
DELETE FROM mpy
WHERE id IN
(SELECT id FROM mpy GROUP BY id HAVING COUNT(*) > 1)
AND ROWID NOT IN
(SELECT MIN(ROWID) FROM mpy GROUP BY id HAVING COUNT(*) > 1);
试下Oracle里面可以,不过效率比较的低。