1. 程式人生 > >Oracle如何實現多個欄位去重

Oracle如何實現多個欄位去重

我們通常使用distinct關鍵字來去除重複記錄,還有沒有其他辦法呢?通過查詢資料,確認group by也可以,利用rowid也可以實現功能。其中,group by是用來分組統計的,能用distinct的地方就不要用group by。下面我們看一下幾種方法具體如何實現,至於選用哪一種,主要還是看需求,實現功能是最主要的。
       首先我們建立測試表hoegh,插入3條記錄。我們可以看到,就前兩個欄位而言,第二條記錄和第三條記錄是重複的。

點選(此處)摺疊或開啟

  1. SQL> 
  2. SQL> create table hoegh(h1 number,h2 number,h3 number
    );
  3. Table created
  4. SQL> insert into hoegh values(1,1,1);
  5. row inserted
  6. SQL> insert into hoegh values(2,2,2);
  7. row inserted
  8. SQL> insert into hoegh values(2,2,8);
  9. row inserted
  10. SQL> commit;
  11. Commit complete
  12. SQL> select * from hoegh;
  13.         H1 H2 H3
  14. ---------- ---------- ----------
  15.          1 1 1
  16.          2 2 2
  17.          2 2 8
  18. SQL>

使用DISTINCT去重
        如下:

點選(此處)摺疊或開啟

  1. SQL> 
  2. SQL> select distincth1,h2 from hoegh;
  3. H1 H2
  4. ---------- ----------
  5. 1 1
  6. 2 2
  7. SQL>

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

點選(此處)摺疊或開啟

  1. SQL> 
  2. SQL> select h1,h2 from hoegh group
     by(h1,h2);
  3.         H1 H2
  4. ---------- ----------
  5.          1 1
  6.          2 2
  7. SQL>
        我們需要將重複記錄刪掉,拿hoegh表來說,我們需要保留h3列值最大的那一行記錄,我們可以通過下面語句來實現。

點選(此處)摺疊或開啟

  1. SQL> 
  2. SQL> delete from hoegh
  3.   2 where h3 not in (select max(h3) from hoegh group by h1,h2);
  4. row deleted
  5. SQL> commit;
  6. Commit complete
  7. SQL> select * from hoegh;
  8.         H1 H2 H3
  9. ---------- ---------- ----------
  10.          1 1 1
  11.          2 2 8
  12. SQL>
使用rowid去重
       ROWID是資料的詳細地址,通過rowid,oracle可以快速的定位某行具體的資料的位置。通過下面的語句,可以保留重複記錄中的最新一條記錄(即最後插入的那條記錄)。

點選(此處)摺疊或開啟

  1. SQL> 
  2. SQL> delete from hoegh 
  3.   2 where rowid not in
  4.   3 (select max(rowid) from hoegh group by(h1,h2));
  5. row deleted
  6. SQL> commit;
  7. Commit complete
  8. SQL> 
  9. SQL> select * from hoegh;
  10.         H1 H2 H3
  11. ---------- ---------- ----------
  12.          1 1 1
  13.          2 2 8
  14. SQL>