熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

在SQL中刪除重復記錄(多種方法)

2013-11-13 22:10:25  來源: Oracle 

  學習sql有一段時間了發現在我建了一個用來測試的表(沒有建索引)中出現了許多的重復記錄後來總結了一些刪除重復記錄的方法在Oracle中可以通過唯一rowid實現刪除重復記錄還可以建臨時表來實現這個只提到其中的幾種簡單實用的方法希望可以和大家分享(以表employee為例)
  
  SQL> desc employee
  
   Name                   Null?  Type
  
  
  emp_id                        NUMBER()
  emp_name                      VARCHAR()
  
  salary                         NUMBER()
  
  可以通過下面的語句查詢重復的記錄
  
  SQL> select * from employee;
  
    EMP_ID EMP_NAME                 SALARY
  
  
  
       sunshine                   
  
       sunshine                   
  
       semon                    
  
       semon                    
  
       xyz                     
  
       semon                    
  
  SQL> select distinct * from employee;
  
    EMP_ID EMP_NAME                   SALARY
  
  
  
       sunshine                   
  
       semon                    
  
       xyz                      
  
  SQL> select * from employee group by emp_idemp_namesalary having count (*)>
  
    EMP_ID EMP_NAME                   SALARY
  
  
  
       sunshine                   
  
       semon                     
  
  SQL> select * from employee e
  
  where rowid in (select max(rowid) from employe e
  
  where eemp_id=eemp_id and
  
  eemp_name=eemp_name and esalary=esalary);
  
    EMP_ID EMP_NAME                   SALARY
  
  
  
       sunshine                   
  
       xyz                      
  
       semon                    
  
   刪除的幾種方法
  
  ()通過建立臨時表來實現
  
  SQL>create table temp_emp as (select distinct * from employee)
  
  SQL> truncate table employee; (清空employee表的數據)
  
  SQL> insert into employee select * from temp_emp; (再將臨時表裡的內容插回來)
  
  ( )通過唯一rowid實現刪除重復記錄在Oracle中每一條記錄都有一個rowidrowid在整個數據庫中是唯一的rowid確定了每條記錄是在Oracle中的哪一個數據文件行上在重復的記錄中可能所有列的內容都相同但rowid不會相同所以只要確定出重復記錄中那些具有最大或最小rowid的就可以了其余全部刪除
  
  SQL>delete from employee e where rowid not in (
  select max(erowid) from employee e where
  
  eemp_id=eemp_id and eemp_name=eemp_name and esalary=esalary);這裡用min(rowid)也可以
  
  SQL>delete from employee e where rowid <(
  select max(erowid) from employee e where
  eemp_id=eemp_id and eemp_name=eemp_name and
  esalary=esalary);
  
  ()也是通過rowid但效率更高
  
  SQL>delete from employee where rowid not in (
  select max(trowid) from employee t group by
  
  temp_idtemp_nametsalary);這裡用min(rowid)也可以
  
    EMP_ID EMP_NAME                   SALARY
  
  
  
       sunshine                   
  
       xyz                      
  
       semon                    
  
  SQL> desc employee
  
   Name                   Null?  Type
  
  
  emp_id                        NUMBER()
  emp_name                      VARCHAR()
  
  salary                         NUMBER()
  
  可以通過下面的語句查詢重復的記錄
  
  SQL> select * from employee;
  
    EMP_ID EMP_NAME                 SALARY
  
  
  
       sunshine                   
  
       sunshine                   
  
       semon                    
  
       semon                    
  
       xyz                     
  
       semon                    
  
  SQL> select distinct * from employee;
  
    EMP_ID EMP_NAME                   SALARY
  
  
  
       sunshine                   
  
       semon                    
  
       xyz                      
  
  SQL> select * from employee group by emp_idemp_namesalary having count (*)>
  
    EMP_ID EMP_NAME                   SALARY
  
  
  
       sunshine                   
  
       semon                     
  
  
  SQL> select * from employee e
  
  where rowid in (select max(rowid) from employe e
  where eemp_id=eemp_id and
  
  eemp_name=eemp_name and esalary=esalary);
  
    EMP_ID EMP_NAME                   SALARY
  
  
  
       sunshine                   
  
       xyz                      
  
       semon                    
  
   刪除的幾種方法
  
  ()通過建立臨時表來實現
  
  SQL>create table temp_emp as (select distinct * from employee)
  
  SQL> truncate table employee; (清空employee表的數據)
  
  SQL> insert into employee select * from temp_emp; (再將臨時表裡的內容插回來)
  
  ( )通過唯一rowid實現刪除重復記錄在Oracle中每一條記錄都有一個rowidrowid在整個數據庫中是唯一的rowid確定了每條記錄是在Oracle中的哪一個數據文件行上在重復的記錄中可能所有列的內容都相同但rowid不會相同所以只要確定出重復記錄中那些具有最大或最小rowid的就可以了其余全部刪除
  
  SQL>delete from employee e where rowid not in (
  select max(erowid) from employee e where
  
  eemp_id=eemp_id and eemp_name=eemp_name and esalary=esalary);這裡用min(row
From:http://tw.wingwit.com/Article/program/Oracle/201311/18369.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.