rowid去重(删除表的重复记录)

简介:

- 构造测试环境
SQL> create table andy(id int,name varchar2(10));
Table created.
SQL>
insert into andy values(1,'a');
insert into andy values(2,'b');
insert into andy values(3,'c');
insert into andy values(4,'d');
SQL> select * from andy;

ID NAME
---------- ----------
1 a
2 b
3 c
4 d
4 rows selected.
SQL> 
insert into andy values(4,'f');
insert into andy values(4,'d');

SQL> select * from andy;
ID NAME
---------- ----------
1 a
2 b
3 c
4 d
4 f
4 d
6 rows selected.
-- 依次group by 表所有字段,通过min(rowid)查看所有唯一记录(去重记录,也就是相同多行数据只显示一行)
SQL> select id,name,min(rowid)
from andy
group by id,name; 
ID NAME MIN(ROWID)
---------- ---------- ------------------
3 c AAAfKTAAEAAACr/AAC
4 d AAAfKTAAEAAACr/AAD
4 f AAAfKTAAEAAACr/AAJ
1 a AAAfKTAAEAAACr/AAA
2 b AAAfKTAAEAAACr/AAB
-- delete 重复数据时,group by 表的个别字段,发现误删除
SQL> delete from andy
where rowid not in (
select min(rowid)
from andy
group by id); 
2 rows deleted.
说明:记录 4 f 被误删。
SQL> select * from andy;

ID NAME
---------- ----------
1 a
2 b
3 c
4 d
-- 构造与上面测试相同环境,即插入刚删除的数据
SQL> 
insert into andy values(4,'f');
insert into andy values(4,'d');
SQL> select * from andy;
ID NAME
---------- ----------
1 a
2 b
3 c
4 d
4 f
4 d
6 rows selected.
-- 依次group by 表所有字段,通过min(rowid)查看所有唯一记录(去重记录,也就是相同多行数据只显示一行)
SQL> select id,name,min(rowid)
from andy
group by id,name; 
ID NAME MIN(ROWID)
---------- ---------- ------------------
3 c AAAfKTAAEAAACr/AAC
4 d AAAfKTAAEAAACr/AAD
4 f AAAfKTAAEAAACr/AAL
1 a AAAfKTAAEAAACr/AAA
2 b AAAfKTAAEAAACr/AAB
-- delete 重复数据时,group by 表的所有字段,发现没有误删。
SQL> delete from andy
where rowid not in (
select min(rowid)
from andy
group by id,name); 
1 row deleted.
-- 检查去重后的数据,发现没有误删
SQL> select * from andy;
ID NAME
---------- ----------
1 a
2 b
3 c
4 d
4 f
说明:
如果想通过rowid去重,那么在 delete 重复数据时,需要group by 表的所有字段。如果只group by 表的个别字段,那么会造成误删除


本文转自 张冲andy 博客园博客,原文链接: http://www.cnblogs.com/andy6/p/6900926.html  ,如需转载请自行联系原作者


相关文章
|
6月前
|
SQL 索引
如何删除表中的重复记录只保留其中一条?
如何删除表中的重复记录只保留其中一条?
199 0
|
SQL 存储 Oracle
通过sql做数据透视表,数据库表行列转换(pivot和Unpivot用法)(一)
在mssql中大家都知道可以使用pivot来统计数据,实现像excel的透视表功能 一、MSsqlserver中我们通常的用法
395 0
oracl查询两表相同的字段
学习oracl查询两表相同的字段。
|
SQL
SQL查询数据并插入新表
SQL查询数据并插入新表     --如果接受数据导入的表已经存在 insert into 表 select * from tablename --如果导入数据并生成表 select * into 表 from tablename  网名:浩秦; 邮箱:root#landv.pw; 只要我能控制一個國家的貨幣發行,我不在乎誰制定法律。
1954 0
|
存储 测试技术 Go
|
移动开发 关系型数据库 Oracle