设为首页 加入收藏

TOP

删除重复的记录
2015-11-21 01:32:54 来源: 作者: 【 】 浏览:0
Tags:删除 重复 记录
因是手动录入数据,所以经常会产生重复的数据,这时就需要删除多余的数据。
?
创建测试用表:
?
CREATE TABLE dupes(
? ? id integer,
? ? name varchar(10)
);
INSERT INTO dupes VALUES(1, 'TOM');
INSERT INTO dupes VALUES(2, 'ALLEN');
INSERT INTO dupes VALUES(3, 'ALLEN');
INSERT INTO dupes VALUES(4, 'SMITH');
INSERT INTO dupes VALUES(5, 'SMITH');
INSERT INTO dupes VALUES(6, 'SMITH');
?
SELECT * FROM dupes;
?
可以看到“ALLEN”和“SMITH”这两个人的数据重复了,现在要求表中name重复的数据只保留一行,其他的删除。
?
删除数据有好几种方法,下面介绍三种方法。
?
方法一:通过name相同,id不同的方式来判断。
?
sql代码如下:
?
DELETE FROM dupes a
?WHERE EXISTS (SELECT 1
? ? ? ? ? FROM dupes b
? ? ? ? ?WHERE a.name = b.name
? ? ? ? ? ?AND a.id > b.id);
?
SELECT * FROM dupes;
?
执行结果如下:
方法二:用ROWID来代替其中的id。
?
sql代码如下:
?
DELETE FROM dupes a
?WHERE EXISTS (SELECT 1
? ? ? ? ? FROM dupes b
? ? ? ? ?WHERE a.name = b.name
? ? ? ? ? ?AND a.ROWID > b.ROWID);
?
执行结果如下:
方法三:通过分析函数根据name分组生成序号,然后删除序号大于1的数据。
?
sql代码如下:
?
DELETE FROM dupes a
?WHERE ROWID IN (SELECT rid
? ? ? ? ? ? ? ? ? ?FROM (SELECT ROWID as rid,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ROW_NUMBER() OVER(PARTITION BY name ORDER BY id) AS seq
? ? ? ? ? ? ? ? ? ? ? ? ? ?FROM dupes)
? ? ? ? ? ? ? ? ? WHERE seq > 1);
?
执行结果和上面一样。
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇多表插入语句 下一篇ORACLE11G将dataguard的rman备份..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: