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的表
這種只適合數量級不大的情況下。 oracle 刪除表中重覆記錄
表demo是重複拷貝自dba objects,有88萬左右,不重複的是27323,沒有索引 方法一 delete from demo a where a.rowid select max rowid from demo b where b.object id a.object id 耗時 幾個小時以...
牛客網 Python 刪掉鍊錶中重複的節點
在乙個排序的鍊錶中,存在重複的結點,請刪除該鍊錶中重複的結點,重複的結點不保留,返回煉表頭指標。例如,鍊錶1 2 3 3 4 4 5 處理後為 1 2 5 鍊錶為排序鍊錶,則可以設定兩個指標前後同時移動,同時判斷後指標的下一節點是否和它相同。若相同則迴圈刪除,最後把該節點刪掉。不同則繼續移動。千補萬...
如何刪除表中重複的記錄?
由於多種原因,在表中可能會有一些重複的記錄,有時需要刪除這些重複的記錄,那麼,如何刪除這些重複的記錄呢?現有如下的表 sql create table a 2 b number 1 表已建立。sql insert into a values 1 已建立 1 行。sql 已建立 1 行。sql 已建立...