在oracle中,可以通過唯一rowid實現刪除重覆記錄;還可以建臨時表來實現...這個只提到其中的幾種簡單實用的方法,希望可以和大家分享(以表employee為例)。
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
2 semon 20000
sql> select distinct * from employee;
emp_id emp_name salary
1 sunshine 10000
2 semon 20000
3 xyz 30000
2. 刪除的幾種方法:
(1)通過建立臨時表來實現
sql>create table temp_emp as (select distinct * from employee)
sql> truncate table employee; (清空employee表的資料)
sql> insert into employee select * from temp_emp; (再將臨時表裡的內容插回來)
( 2)通過唯一rowid實現刪除重覆記錄.在oracle中,每一條記錄都有乙個rowid,rowid在整個資料庫中是唯一的,rowid確定了每條記錄是在oracle中的哪乙個資料檔案、塊、行上。在重複的記錄中,可能所有列的內容都相同,但rowid不會相同,所以只要確定出重覆記錄中那些具有最大或最小rowid的就可以了,其餘全部刪除。
sql>delete from employee e2 where 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=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 and e1.emp_name=e2.emp_name and e1.salary=e2.salary);
(3)也是通過rowid,但效率更高。
sql>delete from employee where rowid not 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
(4)delete from table_name a
where rowid< (select max(rowid) from table_name
where column1=a.column1 and column2=a.column2
and colum3=a.colum3 and ...);
Oracle刪除重覆記錄
oracle刪除重覆記錄的最好的方法 delete from emp e where e.rowid select min y.rowid from emp y where y.empno e.empno 1 子查詢找出某員工最低的rowid 肯定只有乙個 其它大於這條記錄rowid的,全部刪除。2...
刪除重覆記錄
我們經常在資料庫中有重複的記錄這時候我們希望刪除那些重複的記錄 你不要告訴我你是一條條手動刪除的哈 select distinct into newtable form 程式設計客棧nbsp tablename drop table tabwww.cppcns.comlename select in...
SQL查詢重覆記錄,刪除重覆記錄
1 查詢表中多餘的重覆記錄,重覆記錄是根據單個字段 docid 來判斷 select from tablename where docid in select docid from tablename group by docid h ing count docid 1 例二 select from...