3 回答

TA貢獻(xiàn)1825條經(jīng)驗(yàn) 獲得超6個(gè)贊
rownum是在你操作數(shù)據(jù)的時(shí)候,會(huì)默認(rèn)生成一個(gè)序號(hào)從1開始,一直到記錄的總條數(shù),數(shù)字不會(huì)跳躍。
幾種常見的用法:
select rownum,c1 from t1 where rownum != 10 返回的結(jié)果是前9條,原因很簡(jiǎn)單,取出來(lái)前9條后,跳過(guò)第10條,后面的會(huì)繼續(xù)補(bǔ)充第10條,這樣一直到結(jié)尾都還是第十條,不滿足條件,也就是前面的 9條。
select rownum,c1 from t1 where rownum between 1 and 10;查詢的結(jié)果是1到10條,從序號(hào)1到10的數(shù)據(jù)。
select rownum,c1 from t1 where rownum between 2 and 10;查詢結(jié)果為空,因?yàn)樘^(guò)第一條,下一條記錄繼續(xù)rownum為1.一直到數(shù)據(jù)結(jié)束也還是1.也就不存在從2開始的數(shù)據(jù)。

TA貢獻(xiàn)1847條經(jīng)驗(yàn) 獲得超7個(gè)贊
在我說(shuō)什么時(shí)候產(chǎn)生的之前,我想說(shuō)一下SELECT這個(gè)查詢語(yǔ)句的執(zhí)行順序問(wèn)題:
語(yǔ)法是:
select * from table_name
where conditons1
group by some_column
having conditions2
order by some_column;
執(zhí)行時(shí)是這樣的:先從表中查詢出所有的數(shù)據(jù),然后conditions1中篩選出符合條件的數(shù)據(jù),然后對(duì)數(shù)據(jù)進(jìn)行分組,having是對(duì)分組后的數(shù)據(jù)進(jìn)行篩選,最后進(jìn)行排序,不過(guò)聚合函數(shù)與group by一起出現(xiàn)時(shí),聚合函數(shù)會(huì)后執(zhí)行.
明白這個(gè)之后,rownum這個(gè)偽列就不可能會(huì)在where之后出現(xiàn),所以不管查詢有什么條件,在完成
select * from table_name這個(gè)時(shí)候,它就出現(xiàn)了,就會(huì)在表的每一行上按順序加上rownum.
比如你說(shuō)的這個(gè)查詢?nèi)绻氚错樞虺霈F(xiàn)rownum應(yīng)該這樣寫:
select a.*,rownum a_rownum from(
select * from test group by a.sysid
) a;
當(dāng)然了里面的子查詢要正確;
如果說(shuō)你想對(duì)test表中的數(shù)據(jù)查詢出來(lái)之后,按SYSID這一列進(jìn)行排序后查詢3到5條數(shù)據(jù),類似于小數(shù)據(jù)量(千萬(wàn)條以內(nèi))的先排序后分頁(yè):語(yǔ)句可以這樣寫
select * from (
select a.*,rownum t_rownum from (
select * from test order by sysid
)
) where t_rownum between 3 and 5;
總之就是說(shuō):select a.* ,rownum a_rownum from table_name a時(shí)就會(huì)在列上按順序加上rownum.
添加回答
舉報(bào)