Oracle Top N 和 Oracle中的limit問題解決方案
阿新 • • 發佈:2019-02-02
從mysql到oracle遷移一個程式,遇到了sql語句中的limit問題。
查遍網路,所提供的方法都極其麻煩,不利於通用。
以下是我的解決方案,可以與limit媲美。
比如從一個mobileuser 使用者表中查詢2到6條記錄,按照第一次使用時間排序。
mysql語句為:
SELECT userid,password,firstusetime from mobileuser ORDER BY firstusetime DESC limit 2,6;
oracle語句為:
SELECT * FROM ( SELECT userid,password,firstusetime, RANK() OVER (ORDER BY firstusetime DESC ) RN FROM mobileuser ) WHERE RN between 2 and 6;
rank() over 函式代表排行依據,整個sql語句就是從根據“ORDER BY firstusetime DESC”這個標準,找到排行2到6位的資料。
但是存在一個問題,根據排行依據,有些資料是並列的,這樣返回的資料條數就會多於我們期望的。這時我們加一個rownum限制就行了。
SELECT * FROM ( SELECT userid,password,firstusetime, RANK() OVER (ORDER BY firstusetime DESC ) RN FROM mobileuser ) WHERE RN between 2 and 6 and rownum<=5;
查遍網路,所提供的方法都極其麻煩,不利於通用。
以下是我的解決方案,可以與limit媲美。
比如從一個mobileuser 使用者表中查詢2到6條記錄,按照第一次使用時間排序。
mysql語句為:
SELECT userid,password,firstusetime from mobileuser ORDER BY firstusetime DESC limit 2,6;
oracle語句為:
SELECT * FROM ( SELECT userid,password,firstusetime, RANK() OVER (ORDER BY firstusetime DESC ) RN FROM mobileuser ) WHERE RN between 2 and 6;
rank() over 函式代表排行依據,整個sql語句就是從根據“ORDER BY firstusetime DESC”這個標準,找到排行2到6位的資料。
但是存在一個問題,根據排行依據,有些資料是並列的,這樣返回的資料條數就會多於我們期望的。這時我們加一個rownum限制就行了。
SELECT * FROM ( SELECT userid,password,firstusetime, RANK() OVER (ORDER BY firstusetime DESC ) RN FROM mobileuser ) WHERE RN between 2 and 6 and rownum<=5;