- 構造測試環境
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');
4 f
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)
group by id);
2 rows deleted.
說明:記錄 4 f 被誤删。
-- 構造與上面測試相同環境,即插入剛删除的資料
4 f AAAfKTAAEAAACr/AAL
-- delete 重複資料時,group by 表的所有字段,發現沒有誤删。
group by id,name);
1 row deleted.
-- 檢查去重後的資料,發現沒有誤删
說明:
如果想通過rowid去重,那麼在 delete 重複資料時,需要group by 表的所有字段。如果隻group by 表的個别字段,那麼會造成誤删除
本文轉自 張沖andy 部落格園部落格,原文連結: http://www.cnblogs.com/andy6/p/6900926.html ,如需轉載請自行聯系原作者