經常有這樣乙個業務場景,我們在同一張表中有重複的記錄,我們要刪除重複的記錄,這篇文章就是用來解決這個問題的,用的方法是我目前遇到的效率最高的方法(如果有更好的方法歡迎網友提供)。這個方法會用到了rowid,下面簡單介紹一下rowid的定義通常來說,乙個rowid值唯一標識資料中的一行。然而,儲存在同一聚簇中不同的表可以有相同的rowid。
2、實現的方法
方法一:
delete乍一看,我勒個去,這個是什麼東西要,這麼難懂!!沒關係,下面給您解釋一下,就很好懂了。from
hr.employees
where rowid in
(
select
rowid
from
(
select
first_name,
last_name,
rowid,
row_number()
over(partition by first_name,last_name order
by employee_id) as staff_row --
按照保留的唯一字段進行分割槽,取row_number
from
hr.employees
)where staff_row >
1);
針對的是oracle內建的示例使用者hr中的employees這張表,我們希望的是first_name和last_name沒有重複的項(如果你的業務需要時別的話可以相應的轉換,如在成績表中的學號就是唯一個,就partition by學號),所以對這兩個字段進行partition by。
在子查詢的子查詢中我們選擇的主要目的是rowid和row_number(first_name和last_name只是用來輔助理解加進去的字段);子查詢中我們選擇了row_number > 1的rowid,這樣的話按照first_name和last_name分組中每乙個分組只有一條記錄沒有被選擇;最外面的delete就直接把選擇出來的rowid進行了刪除。至此完成了hr.employees對於first_name和last_name的去重。
有朋友會說,媽蛋這太難理解了吧!在這種情況下,往往有方法二~~~
方法二:
delete這個明顯就比方法一好多了,子查詢中我們先選除了rowid,然後按照我們想要保留的唯一字段進行分組,並取每組最小的rowid(注意是子查詢表的rowid);然後在用not in刪除除開最小的rowid以外的所有記錄。from
hr.employees t1
where t1.rowid notin(
select
min(t2.rowid)
from
hr.employees t2
group
by t2.employee_id --
按照想要唯一保留的字段進行分組
);
怎麼樣,這個方法是不是瞬間解決並且非常好理解?但是你以為這樣就結束了?no no no
方法三:
delete這個方式看起來和方法二差不多,但是想要說的是,他用的是連線,他用的是連線,不敢說連線一定比group by快,但是基本上不會輸group by,而且在一般的情況下也是最快的了。而且外層的">"可以用到索引,就是各種快。from
hr.employees t1
where t1.rowid >
(
select
min(t2.rowid)
from
hr.employees t2
where t1.employee_id = t2.employee_id --按照想要唯一保留的字段進行匹配
);
方法也同樣說一下,子查詢中按照要保留的字段對t1和t2進行關聯,然後選擇出最小的rowid(注意是子查詢表的rowid),然後在外層用">"只保留每個匹配結果最小的一條記錄。然後就瞬間刪除重複的記錄
Oracle用rowid刪除同一張表的重覆記錄
經常有這樣乙個業務場景,我們在同一張表中有重複的記錄,我們要刪除重複的記錄,這篇文章就是用來解決這個問題的,用的方法是我目前遇到的效率最高的方法 如果有更好的方法歡迎提供 這個方法會用到了rowid,下面簡單介紹一下rowid的定義 通常來說,乙個rowid值唯一標識資料中的一行。然而,儲存在同一聚...
oracle 使用rowid刪除重複資料
經常有這樣乙個業務場景,我們在同一張表中有重複的記錄,我們要刪除重複的記錄,這篇文章就是用來解決這個問題的,用的方法是我目前遇到的效率最高的方法 如果有更好的方法歡迎提供 這個方法會用到了rowid,下面簡單介紹一下rowid的定義 rowid 資料庫中行的全域性唯一位址 對於資料中的每一行,row...
Oracle查詢 rownum和rowid的區別
在oracle中,有乙個很有趣的東西,那就是rownum。當你從某個表中查詢資料的時候,返回的結果集中都會帶有rownum這個字段,而且有時候也可以使用rownum進行一些條件查詢。在查詢中,我們可以注意到,類似於 select xx from table where rownum n n 1 這樣...