1. 程式人生 > >oracle去重複資料的處理方法

oracle去重複資料的處理方法

1。DISTINCT 方法就不必說了,大家都清楚。(主要是我用不上,用了下面的方法)

2。通過查詢方法來取得不重複資料

-- 根據去重複的欄位來查詢資料的第一個ID進行匹配
select * from FM_COALBLENDING_QUALITY where heat_number='1' and ID in (select min(t.ID) from FM_COALBLENDING_QUALITY t where t.HEAT_NUMBER='1' group by t.FM_DATE)

還有很多方法,暫時不記。

下面拷貝下別人的例子:

由於設計需要,需要查詢不重複的記錄值,同類問題,想必大家都遇到過,於是乎馬上GOOGLE一下,發現此類問題還挺多,解決方案也不少,仔細看看。
例如有如下表結構和值
table
fid name sex
1 a 男
2 b 男
3 c 女
4 d 女
5 a 男
6 b 男
方案一:distinct
select distinct name from table
得到結果:
name
a
b
c
d
實現效果,那如果要同時開啟其它記錄呢?再試試
select distinct name,id from table
測試沒什麼效果,查下得知,這樣實際是要name和id欄位都重複才被篩選。繼續查詢可得如下方法:
方案二:group by
select *, count(distinct name) from table group by name
Oracle下測試失敗,據說MYSQL下通過,不管,繼續思考....
翻翻書,試試
select min(fid),name,sex from table group by name
成功,現實如下結果:
fid name sex
1 a 男
2 b 男
3 c 女
4 d 女
繼續思考,如果要開啟所有記錄,不指定欄位用(*),貌似這方法就不行了!
select * from table where fid in(Select min(fid) FROM table group by name)
測試成功
fid name sex
1 a 男
2 b 男
3 c 女
4 d 女
方案三:
本來已經完了,突然想起前幾天在網上查了查詢資料中所有某欄位不重複的記錄
select * from table where name in(select name from table group by name having count(name)=2)
得到如下結果:
fid name sex
1 a 男
2 b 男
5 a 男
6 b 男
以此類推:
select * from table where name in(select name from table group by name having count(name)=1)
按道理說沒問題,大家試試~~
再多的欄位都全部現實。哎,原來如此簡單!回顧網上方法distinct,Inner Join等等,麻煩,而且有很大侷限性.
總結如下:
select distinct name from table開啟不重複記錄的單個欄位
select * from table where fid in(Select min(fid) FROM table group by name)開啟不重複記錄的所有欄位值
select * from table where name in(select name from table group by name having count(name)=1)開啟不重複任意次數的所有記錄