Oracle資料庫查詢重複資料及刪除重複資料方法
工作中,發現Oracle資料庫表中有許多重複的資料,而這個時候老闆需要統計表中有多少條資料時(不包含重複資料),只想說一句MMP,庫中好幾十萬資料,腫麼辦,無奈只能自己在網上找語句,最終成功解救,下面是我一個實驗,很好理解。
假設有一張人員資訊表cs(姓名,證件號,地址),將表中三個欄位資料都重複的資料篩選出來:
distinct:這個關鍵字來過濾掉多餘的重複資料只保留一條資料
select * from from cs ------所有欄位
select distinct xm,zjh,dz from cs; -----指定欄位
在實踐中往往只用它來返回不重複資料的條數,因為distinct對於一個數據量非常大的庫來說,無疑是會直接影響到效率的。
-----------------------------------------------------------------------------------------------------------------------
查詢重複資料、刪除重複資料的方法如下:↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
①rowid用法: oracle帶的rowid屬性,進行判斷是否存在重複資料。
查詢重複資料:
select a.* from cs a where rowid !=(select max(rowid) from cs b where a.xm=b.xm and a.zjh=b.zjh and a.dz=b.dz)
刪除重複資料:
delete from cs a where rowid !=(select max(rowid) from cs b where a.xm=b.xm and a.zjh=b.zjh and a.dz=b.dz)
②group by :一般用於將查詢結果分組,多配合聚合函式,sum,count,min,max,having等一起使用。
查詢重複資料:
select max(xm),max(zjh),max(dz),count(xm) as 記錄數 from cs group by xm having count(xm)>1 ---------適用於欄位少的
select * from cs a where (a.xm,a.zjh,a.dz) in (select xm,zjh,dz from cs group by xm,zjh,dz having count(*)>1)
and rowid not in (select min(rowid) from cs group by xm,zjh,dz having count(*)>1) -------適用於多欄位
去重重複資料:多個欄位,只留有rowid最小的記錄 。
delete from cs a where (a.xm,a.zjh,a.dz) in (select xm,zjh,dz from cs group by xm,zjh,dz having count(*)>1) and rowid not in (select min(rowid) from cs group by xm,zjh,dz having count(*)>1)
③row_number()over(partition by 列)
select xm,zjh,dz,row_number()over(partition by zjh order by xm) 記錄號 from cs
去重重複資料:
with cs1 as (select xm,zjh,dz,row_number()over(partition by zjh order by zjh) 記錄號 from cs)select * from cs1 where 記錄號=1
更多Oracle相關資訊見 Linux/2018-09/../../topicnews.aspx?tid=12" target="_blank" rel="nofollow,noindex"> Oracle 專題頁面 https://www.linuxidc.com/topicnews.aspx?tid=12
Linux公社的RSS地址 : https://www.linuxidc.com/rssFeed.aspx
本文永久更新連結地址: https://www.linuxidc.com/Linux/2018-09/15434.htm