天天看點

Oracle分頁(limit方式的運用)+付上SqlServer分頁+千萬級資料分頁的存儲過程

select * from a_matrix_navigation_map

where rowid not in(select rowid from a_matrix_navigation_map where rownum<=0) and rownum<=10

第二種:

SELECT * FROM

(

SELECT A.*, rownum r

FROM

(

SELECT *

FROM a_matrix_navigation_map

) A

WHERE rownum <= 10

) B

WHERE r > 0

第三種

SELECT * FROM table WHERE ROWNUM<101;

minus

SELECT * FROM table WHERE ROWNUM<91;

第四種

可以用變通一點的辦法,我給個示例:

sql = "select a_id,a_title,a_author,aID,a_time,a_readtime,sID from article order by a_id";

int a;

while (rs.next()) {

a++;

if (a=ipage+spage)continue;

...

}

其中第二種是非常成熟的分頁 我的執行個體~ 即可實作 類似limit 功能 $bandanspager="select * from abc t2,abc1 t1 where t1.id=t2.id group by t1.id";    $sql=" SELECT * FROM          (             SELECT A.*, rownum r             FROM             ( ". $bandanspager.") A            WHERE rownum <= 10          ) B

         WHERE r > 0

Oracle不支援類似于 MySQL 中的 limit. 但你還是可以rownum來限制傳回的結果集的行數.

如果你隻希望傳回前十行紀錄,你可以這樣寫:

SELECT * FROM table WHERE ROWNUM<10;

但是下面的語句是不對的:

SELECT * FROM table WHERE ROWNUM>90 AND ROWNUM<100;

這是因為 Oracle 認為這個條件不成立,是以沒有傳回。

你應該這樣寫:

SELECT * FROM table WHERE ROWNUM<101;

minus

SELECT * FROM table WHERE ROWNUM<91;

其他資料庫模拟實作mysql的limit文法

假如我有個user表,我想查詢符合某些條件的第50個使用者開始的10個使用者,且不能使用id号between and那樣查詢,應該怎麼寫SQL語句?

  在mysql資料庫中有limit,offset語句可以友善的實作,那麼在SQL server中呢?SQL Server是否支援limit和offset語句呢?

select top 10 * from

(select top 60 * from [user] order by userid) aa

order by userid desc

  oracle,如果想從表中取出按照某字段排序前M到N條記錄

  下面的ORACLE語句是最好的:

SQL> select ID from

     (

       select ID , rownum as con from

       (

        select ID from TestSort order by ID

       )

       where rownum <= 3  

     )

     where con >= 2;

ID

----------

         2

         3

SqlServer分頁:

一條SQL語句搞定Sql Server 2000 分頁

Sql Server 2000 的分頁方案大多采用存儲過程來完成,存儲過程書寫比較複雜,在參考了 ITPUB 網站上衆多網友的意見後用一條 SQL 語句就可以實作分頁功能。   SELECT TOP 頁大小 * FROM  Users WHERE  (ID NOT IN (SELECT TOP ( 頁大小 *( 頁數 -1)) ID FROM Users ORDER BY ID DESC)) ORDER BY  ID DESC   注:頁大小指的是每頁顯示的條數。黃底部分是需要用程式運算後的一個數字。

千萬級資料分頁的存儲過程:

引用自:http://blog.csdn.net/leizhipan/archive/2006/10/01/1313507.aspx

CREATE PROCEDURE GetRecordFromPage

    @tblName      varchar(255),       -- 表名

    @fldName      varchar(255),       -- 字段名

    @PageSize     int = 10,           -- 頁尺寸

    @PageIndex    int = 1,            -- 頁碼

    @OrderType    bit = 0,            -- 設定排序類型, 非 0 值則降序

    @strWhere     varchar(2000) = ''  -- 查詢條件 (注意: 不要加 where)

AS

declare @strSQL   varchar(6000)       -- 主語句

declare @strTmp   varchar(1000)       -- 臨時變量

declare @strOrder varchar(500)        -- 排序類型

if @OrderType != 0

begin

    set @strTmp = '<(select min'

    set @strOrder = ' order by [' + @fldName + '] desc'

end

else

begin

    set @strTmp = '>(select max'

    set @strOrder = ' order by [' + @fldName +'] asc'

end

set @strSQL = 'select top ' + str(@PageSize) + ' * from ['

    + @tblName + '] where [' + @fldName + ']' + @strTmp + '(['

    + @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['

    + @fldName + '] from [' + @tblName + ']' + @strOrder + ') as tblTmp)'

    + @strOrder

if @strWhere != ''

    set @strSQL = 'select top ' + str(@PageSize) + ' * from ['

        + @tblName + '] where [' + @fldName + ']' + @strTmp + '(['

        + @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['

        + @fldName + '] from [' + @tblName + '] where ' + @strWhere + ' '

        + @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder

if @PageIndex = 1

begin

    set @strTmp = ''

    if @strWhere != ''

        set @strTmp = ' where (' + @strWhere + ')'

    set @strSQL = 'select top ' + str(@PageSize) + ' * from ['

        + @tblName + ']' + @strTmp + ' ' + @strOrder

end

exec (@strSQL)

GO

繼續閱讀