Oracle資料庫中由於沒有做任何約束,如何刪掉表中重複的記錄

來源:互聯網
上載者:User

Oracle資料庫中由於沒有設定任何約束,裡面含有很多的重複項。現在的問題是如何刪掉這些重複項,重複的記錄只保留其中的一條。如下建表語句

CREATE TABLE message_student3(

      stu_id INTEGER NOT NULL,  --表中沒有唯一性限制式

      stu_number varchar(30),

      stu_name VARCHAR(10) NOT NULL,

      stu_age NUMBER(2) NOT NULL

);

INSERT INTO message_student3 VALUES(1,'100320036','張珊',18);

INSERT INTO message_student3 VALUES(2,'100320037','劉備',19);

INSERT INTO message_student3 VALUES(3,'100320038','張飛',19);

INSERT INTO message_student3 VALUES(4,'100320039','呂布',19);

INSERT INTO message_student3 VALUES(5,'100320040','周瑜',19);

INSERT INTO message_student3 VALUES(6,'100320041','孫權',19);

INSERT INTO message_student3 VALUES(7,'100320042','張遼',19);

INSERT INTO message_student3 VALUES(1,'100320036','張珊',18);

INSERT INTO message_student3 VALUES(2,'100320037','劉備',19);

INSERT INTO message_student3 VALUES(3,'100320038','張飛',19);

INSERT INTO message_student3 VALUES(4,'100320039','呂布',19);

INSERT INTO message_student3 VALUES(5,'100320040','周瑜',19);

INSERT INTO message_student3 VALUES(6,'100320041','孫權',19);

INSERT INTO message_student3 VALUES(7,'100320042','張遼',19);

分析:由於表沒有做約束,所以重複記錄的各個欄位必然是相等的,然而對於刪除操作要麼是全部刪除要麼是根據一個條件刪除,前者肯定是不行,後者呢,一刪除就重複的都刪除了。所以要刪掉其中重複項的切入點必須要有一個可以區別不同記錄的量。想想在做oracle的分頁的時候,用到了rownum,於是想用rownum來試一下。但是每一個新的select語句都有一個新的rownum,用別名就是無法之前的,這麼寫可能有些含糊,於是在網上找了一些有關這方面的資料,發現其實我應該要用的是rowid。rownum和rowid有什麼不同呢?下面是摘抄的內容:原地址是:

rownum和rowid都是偽列,但是兩者的根本是不同的,rownum是根據sql查詢出的結果給每行分配一個邏輯編號,所以你的sql不同也就會導致最終rownum不同,

但是rowid是物理結構上的,在每條記錄insert到資料庫中時,都會有一個唯一的物理記錄 (不會變),
例如  AAAMgzAAEAAAAAgAAB 7499 ALLEN SALESMAN 7698 1981/2/20 1600.00 300.00 30
這裡的AAAMgzAAEAAAAAgAAB物理位置對應了這條記錄,這個記錄是不會隨著sql的改變而改變。
因此,這就導致了他們的使用情境不同了,通常在sql分頁時或是尋找某一範圍內的記錄時,我們會使用rownum。

1、rownum
例如:
尋找2到10範圍內的記錄(這裡包括2和10的記錄)

select *

  from (select rownum rn, a.* from emp a) t

where t.rn between 2 and 10;

尋找前三名的記錄
select * from emp a where rownum < 3;這裡我們要注意,直接用rownum尋找的範圍必須要包含1;因為rownum是從1開始記錄的,當然你可以把rownum查出來後放在一個虛表中作為這個虛表的欄位再根據條件查詢。
例如:

select *

  from (select rownum rn, a.* from emp a) t

where t.rn > 2;

2、rowid
我們在處理一張表中重複記錄時經常用到他
因此我們可以根據rowid來處理,rowid具有唯一性,查詢時效率是很高的,
回到最開始的問題,要刪掉其中重複的使用下面的語句就可了

delete from message_student3 a where rowid > (select min(rowid) from  message_student3 b where a.stu_id = b.stu_id);

commit;


這樣就可以了。

當然你也可以用一個很原始的方法,就是將有重複記錄的表中的資料導到另外一張表中,最後再倒回去。

create table stu_tmp as select distinct* from stu;

truncate table sut;        //清空表記錄

insert into stu select * from stu_tmp;    //將暫存資料表中的資料添加回原表但是要是stu的表


這種只適合數量級不大的情況下。

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.