Oracle用rowid刪除同一張表的重覆記錄

2022-08-19 07:36:10 字數 2456 閱讀 5447

經常有這樣乙個業務場景,我們在同一張表中有重複的記錄,我們要刪除重複的記錄,這篇文章就是用來解決這個問題的,用的方法是我目前遇到的效率最高的方法(如果有更好的方法歡迎網友提供)。這個方法會用到了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

from

hr.employees t1

where t1.rowid notin(

select

min(t2.rowid)

from

hr.employees t2

group

by t2.employee_id --

按照想要唯一保留的字段進行分組

);

這個明顯就比方法一好多了,子查詢中我們先選除了rowid,然後按照我們想要保留的唯一字段進行分組,並取每組最小的rowid(注意是子查詢表的rowid);然後在用not in刪除除開最小的rowid以外的所有記錄

怎麼樣,這個方法是不是瞬間解決並且非常好理解?但是你以為這樣就結束了?no no no

方法三:

delete

from

hr.employees t1

where t1.rowid >

(

select

min(t2.rowid)

from

hr.employees t2

where t1.employee_id = t2.employee_id --按照想要唯一保留的字段進行匹配

);

這個方式看起來和方法二差不多,但是想要說的是,他用的是連線,他用的是連線,不敢說連線一定比group by快,但是基本上不會輸group by,而且在一般的情況下也是最快的了。而且外層的">"可以用到索引,就是各種快。

方法也同樣說一下,子查詢中按照要保留的字段對t1和t2進行關聯,然後選擇出最小的rowid(注意是子查詢表的rowid),然後在外層用">"只保留每個匹配結果最小的一條記錄。然後就瞬間刪除重複的記錄

此時有朋友以為這是最快的辦法了,但是,我想說,不是,不是!請看下面最快的方法!

--

騙一下你的,上面已經是本人接觸到的最快的方法了

view code

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 這樣...