學習sql有一段時間了,發現在我建了一個用來測試的表(沒有建索引)中出現了許多的重復記錄。後來總結了一些刪除重復記錄的方法,在Oracle中,可以通過唯一rowid實現刪除重復記錄;還可以建臨時表來實現...這個只提到其中的幾種簡單實用的方法,希望可以和大家分享(以表employee為例)。
SQL> desc employee
Name Null? Type
----------------------------------------- -------- ------------------
emp_id NUMBER(10)
emp_name VARCHAR2(20)
salary &n
bsp; NUMBER(10,2)
可以通過下面的語句查詢重復的記錄:
SQL> select * from employee;
EMP_ID EMP_NAME SALARY
---------- ---------------------------------------- ----------
imes New Roman';"> 1 sunshine 10000
1 sunshine 10000
2 semon 20000
2 semon 20000
3 xyz 30000
style="font-size: 10.5pt; font-family: 'Times New Roman';"> 2 semon 20000
SQL> select distinct * from employee;
EMP_ID EMP_NAME SALARY
---------- ---------------------------------------- ----------
le="font-size: 10.5pt; font-family: 'Times New Roman';"> 1 sunshine 10000
2 semon 20000
3 xyz 30000
SQL> select * from employee 144); font-family: 'CourIEr New';">group by emp_id,emp_name,salary having count (*)>1
EMP_ID EMP_NAME SALARY
---------- ---------------------------------------- ----------
1 sunshine 10000
2 semon 20000
SQL> select * from employee e1
where rowid in ( e1.emp_name=e2.emp_name and e1.salary
EMP_ID EMP_NAME SALARY ---------- ---------------------------------------- ---------- 1 sunshine 10000 3 xyz 30000 2 semon
2. 刪除的幾種方法: (1)通過建立臨時表來實現 SQL>create table temp_emp as (select distinct * from employee) SQL> truncate table employee;
where e1.emp_id=e2.emp_id and
SQL> insert into employee select * from temp_emp; (再將臨時表裡的內容插回來)
"EN-US" style="font-size: 10.5pt; font-family: 'Times New Roman';">( 2)通過唯一rowid實現刪除重復記錄.在Oracle中,每一條記錄都有一個rowid,rowid在整個數據庫中是唯一的,rowid確定了每條記錄是在Oracle中的哪一個數據文件、塊、行上。在重復的記錄中,可能所有列的內容都相同,但rowid不會相同,所以只要確定出重復記錄中那些具有最大或最小rowid的就可以了,其余全部刪除。
SQL>delete from employee e2 where
144);">rowid not in (
select max(e1.rowid) from employee e1 where
e1.emp_id=e2.emp_id and e1.emp_name=e2.emp_name and e1.salary=
ang="EN-US" style="font-size: 9pt; color: olive; font-family: 'CourIEr New';">e2.salary);--這裡用min(rowid)也可以。SQL>delete from employee e2 where rowid <(
select max(e1.rowid) from employee e1 where
e1.emp_id=e2.emp_id
144);">and e1.emp_name=e2.emp_name and
e1.salary=e2.salary);
(3)也是通過rowid,但效率更高。
SQL>delete from employee where rowid not
144);">in (
select max(t1.rowid) from employee t1 group by
t1.emp_id,t1.emp_name,t1.salary);--這裡用min(rowid)也可以。
EMP_ID EMP_NAME
SALARY---------- ---------------------------------------- ----------
1 sunshine 10000
3 xyz 30000
2 semon 20000
an';">SQL> desc employee
Name Null? Type
----------------------------------------- -------- ------------------
emp_id NUMBER(10)
emp_name VARCHAR2(20)
salary NUMBER(10,2)
可以通過下面的語句查詢重復的記錄:
SQL> select * from employee;
EMP_ID EMP_NAME SALARY
---------- ---------------------------------------- ----------
; 1 sunshine 10000
1 sunshine 10000
2 semon 20000
2 semon 20000
3 xyz 30000
tyle="font-size: 10.5pt; font-family: 'Times New Roman';"> 2 semon 20000 />SQL> select distinct * from employee;
EMP_ID EMP_NAME SALARY
---------- ---------------------------------------- ----------
1 sunshine 10000
2 semon 20000
3 xyz 30000
SQL> select * from
IEr New';"> employee group by emp_id,emp_name,salary having count (*)>1EMP_ID EMP_NAME SALARY
---------- ---------------------------------------- ----------
font-family: 'Times New Roman';"> 1 sunshine 10000
2 semon 20000
SQL> select * from employee e1
where rowid in
="font-size: 9pt; color: olive; font-family: 'CourIEr New';"> (select max(rowid) from employe e2e1.emp_name=e2.emp_name 144); font-family: 'CourIEr New';">and e1.salary=e2.salary);
EMP_ID EMP_NAME SALARY
---------- ---------------------------------------- ----------
1 sunshine 10000
3 xyz ; 30000
-US" style="font-size: 10.5pt; font-family: 'Times New Roman';"> 2 semon 20000