rownum和rowid都是偽列,,但是兩者的根本是不同的,rownum是根據(jù)sql查詢出的結(jié)果給每行分配一個(gè)邏輯編號,,所以你的sql不同也就會(huì)導(dǎo)致最終rownum不同,,但是rowid是物理結(jié)構(gòu)上的,在每條記錄insert到數(shù)據(jù)庫中時(shí),,都會(huì)有一個(gè)唯一的物理記錄 ,, 例如 AAAMgzAAEAAAAAgAAB 7499 ALLEN SALESMAN 7698 1981/2/20 1600.00 300.00 30 這里的AAAMgzAAEAAAAAgAAB物理位置對應(yīng)了這條記錄,這個(gè)記錄是不會(huì)隨著sql的改變而改變,。 因此,,這就導(dǎo)致了他們的使用場景不同了,通常在sql分頁時(shí)或是查找某一范圍內(nèi)的記錄時(shí),,我們會(huì)使用rownum,。 1、rownum 例如: 查找2到10范圍內(nèi)的記錄(這里包括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;因?yàn)閞ownum是從1開始記錄的,,當(dāng)然你可以把rownum查出來后放在一個(gè)虛表中作為這個(gè)虛表的字段再根據(jù)條件查詢,。 例如: select * from (select rownum rn, a.* from emp a) t where t.rn > 2;這就可以了 2、rowid 我們在處理一張表中重復(fù)記錄時(shí)經(jīng)常用到他,,當(dāng)然你也可以用一個(gè)很原始的方法,,就是將有重復(fù)記錄的表中的數(shù)據(jù)導(dǎo)到另外一張表中,最后再倒回去,。 SQL>create table stu_tmp as select distinct* from stu; SQL>truncate table sut; //清空表記錄 SQL>insert into stu select * from stu_tmp; //將臨時(shí)表中的數(shù)據(jù)添加回原表但是要是stu的表數(shù)據(jù)是百萬級或是更大的千萬級的,,那這樣的方法顯然是不明智的,因此我們可以根據(jù)rowid來處理,,rowid具有唯一性,,查詢時(shí)效率是很高的, 例如,,學(xué)生表中的姓名會(huì)有重復(fù)的情況,,但是學(xué)生的學(xué)號是不會(huì)重復(fù)的,如果我們要?jiǎng)h除學(xué)生表中姓名重復(fù)只留學(xué)號最大的學(xué)生的記錄,,怎么辦呢,? delete from stu a where rowid not in (select max(rowid) from stu b where a.name = b.name and a.stno < b.stno); 這樣就可以了。 |
|