Oracle如何實現多個欄位去重

2021-07-11 16:39:30 字數 1983 閱讀 1034

我們通常使用distinct關鍵字來去除重覆記錄,還有沒有其他辦法呢?通過查詢資料,確認group by也可以,利用rowid也可以實現功能。其中,group by是用來分組統計的,能用distinct的地方就不要用group by。下面我們看一下幾種方法具體如何實現,至於選用哪一種,主要還是看需求,實現功能是最主要的。

首先我們建立測試表hoegh,插入3條記錄。我們可以看到,就前兩個字段而言,第二條記錄和第三條記錄是重複的。

sql> 

sql> create table hoegh(h1 number,h2 number,h3 number);

table created

sql> insert into hoegh values(1,1,1);

1 row inserted

sql> insert into hoegh values(2,2,2);

1 row inserted

sql> insert into hoegh values(2,2,8);

1 row inserted

sql> commit;

commit complete

sql> select * from hoegh;

h1 h2 h3

---------- ---------- ----------

1 1 1

2 2 2

2 2 8

sql>

使用distinct去重

如下:

sql> 

sql> select distinct h1,h2 from hoegh;

h1 h2

---------- ----------

1 12 2

sql>

使用group by去重

gruop by是oracle中常用的分組函式,我們看一下如何使用group by來實現去重功能。

sql> 

sql> select h1,h2 from hoegh group by(h1,h2);

h1 h2

---------- ----------

1 12 2

sql>

我們需要將重覆記錄刪掉,拿hoegh表來說,我們需要保留h3列值最大的那一行記錄,我們可以通過下面語句來實現。

sql> 

sql> delete from hoegh

2 where h3 not in (select max(h3) from hoegh group by h1,h2);

1 row deleted

sql> commit;

commit complete

sql> select * from hoegh;

h1 h2 h3

---------- ---------- ----------

1 1 1

2 2 8

sql>

使用rowid去重

rowid是資料的詳細位址,通過rowid,oracle可以快速的定位某行具體的資料的位置。通過下面的語句,可以保留重覆記錄中的最新一條記錄(即最後插入的那條記錄)。

sql> 

sql> delete from hoegh

2 where rowid not in

3 (select max(rowid) from hoegh group by(h1,h2));

1 row deleted

sql> commit;

commit complete

sql>

sql> select * from hoegh;

h1 h2 h3

---------- ---------- ----------

1 1 1

2 2 8

sql>

mysql根據多個欄位去重

現在在搞資料處理,裡面有個資料是根據兩個欄位來區別是不是一樣的,那如果在設計的時候沒有將那兩個字段設計成唯一主鍵,或者唯一索引,後續就要進行去重,上網查了好久,發現都沒有啥好的解決方法,後來想了下,將那兩個主鍵連線一下,然後group分組不就行了?雖然效能很弱雞,但是這個sql我又只是用一次而已。s...

oracle中distinct多個字段

select distinct t.f resume id t.f resume status t.f resume status,t.f resume status,t.f recruit channel,t.f small channel id from css.t resume info t ...

Oracle 多表更新多個字段

總體原則 1 更新的時候一定要加where條件,否則必然引起該字段的所有記錄更新 2 跨表更新時,set和where時,儘量減少掃瞄次數,從而提高優化 update更新例項 1 最簡單的形式 單錶更新 sql 經確認customers表中所有customer id小於1000均為 北京 1000以內...