給你一個(gè)提示,Oracle每行數(shù)據(jù)都會有一個(gè)ROWID,解析出行號。你可以找到上一行的ROWID和下一行的ROWID,而且用ROWID查詢,效率非常高!??!
創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),肅州企業(yè)網(wǎng)站建設(shè),肅州品牌網(wǎng)站建設(shè),網(wǎng)站定制,肅州網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,肅州網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
如果你是要排序過的數(shù)據(jù),只能用索引組織表?;蛘呦扰判?,用分析函數(shù)得到一個(gè)編號偽劣,然后根據(jù)這個(gè)編號再找前一條,或者后一條。
另外,Oracle SQL中還有一個(gè)函數(shù),LEAD,可以找到上一行的值,當(dāng)然還有一個(gè)下一行的值??梢园俣纫幌拢也惶浀昧?。
如:
SELECT last_name, hire_date,
LEAD(hire_date, 1) OVER (ORDER BY hire_date) AS "NextHired"
FROM employees WHERE department_id = 30;
這是個(gè)行列轉(zhuǎn)換的問題,只是你這個(gè)例子test樣表,是行固定還是列固定?還是不定行不定列?這些情況都有不同的寫法。定行或者定列的話就直接用decode(),或者case when ...等等直接判斷列名稱,或者構(gòu)造一個(gè)偽劣用rownum.方法網(wǎng)上很多,你直接查找‘oracle 行列轉(zhuǎn)換’即可。最難寫的就是不定行,不定列的情況,如果是那樣就得寫動態(tài)SQL了,或者寫存儲過程,或者寫函數(shù),代碼塊也行,總之一條語句或許可以實(shí)現(xiàn),但是太復(fù)雜。
看創(chuàng)建時(shí)間吧,可以用一個(gè)偽劣來看,ORA_ROWSCN,這個(gè)代表記錄的變動
select ORA_ROWSCN,t.* from table t
可以用SCN_TO_TIMESTAMP(ora_rowscn)這個(gè)函數(shù)來看到ora_rowscn所代表的變動點(diǎn),也就是時(shí)間
select *
from (select tab.*, rownum as rk from tab order by 單價(jià) desc) t
where rk between 6 and 10
如果你的表非常大,那查詢最新添加的一條記錄就盡量讓ORACLE走主鍵索引。
select * from table_name where id in (select max(id) from table_name);
這樣ORACLE會走索引快速掃描得出最后一條ID的值,然后通過唯一索引得出最后一條記錄,這樣效率較高。