现在的位置: 首页 > 综合 > 正文

SQL数据库分页排序记录

2012年10月08日 ⁄ 综合 ⁄ 共 4292字 ⁄ 字号 评论关闭

    如大家要转载,请保留本人的版权:
    /*
    *Description:SQL数据库数据分页技术
    *Auther:chongchong2008-天真的好蓝啊
    *MSN:chongchong2008@msn.com
    *QQ:154674958
    *Blog:chongchong2008.cnblogs.com
    *Dates:2010-01-13
    *Copyright:ChongChong2008 YiChang HuBei China
    */

    说说SQL数据库按照降序排列的情况,如下:

 

    方法一:Select Top Min(Max) Select Top 方法

    问题,第一页的时候有bug
    问题,不能多字段排序,必须要求主键,即排序字段唯一不能重复,且此主键的类型必须是int类型,如果多字段排序,还要求主键是连续的,不能断裂。

    读取第二页数据的基本SQL代码,每页10条数据
    如下降序排序:
   

    SELECT TOP 10 * FROM table_test where table_ID<(
        SELECT MIN(table_ID) FROM (
            SELECT TOP 20 table_ID FROM table_test ORDER BY table_ID DESC
        ) t
    )ORDER BY table_ID DESC

 

    方法二:Select In Select Top 方法 
 
    问题,最后一页的时候有bug
    问题,要求有主键,即要求一个不能重复的唯一字段,主键的类型可以任意,可以多字段排序,多个字段都可以有自己单独的排序方式

    读取第二页数据的基本SQL代码,每页10条数据

    如下降序排序:

    SELECT * FROM table_test where table_ID in (
        SELECT top 10 table_ID FROM (
            SELECT TOP 10 table_ID,table_OrderID FROM table_test ORDER BY table_OrderID DESC,table_ID DESC
        ) t order by table_OrderID ASC,table_ID ASC
    )order by table_OrderID DESC,table_ID DESC

    如下升序排序:

    SELECT * FROM table_test where table_ID in (
        SELECT top 10 table_ID FROM (
            SELECT TOP 10 table_ID,table_OrderID FROM table_test ORDER BY table_OrderID ASC,table_ID ASC
        ) t order by table_OrderID DESC,table_ID DESC
    )order by table_OrderID ASC,table_ID ASC

 

    第一种方法其实很好,如果你不要求用其他的非主键排序的话,那绝对是你的首选。

    不过,在要求非主键字段排序的场合下,就得用上第二种方法了,而且还可以多字段排序,下下主要说说这种排序方法。
    这种排序方法要求排序字段的排序方式反转,在你写SQL语句的时候要用到,为了支持多字段的自动反转,下面我写了一个函数,方便调用。

    如下:

   

    -- =============================================
    -- Description: 反转排序字段的排序方式
    -- Author:  chongchong2008 - 天真的好蓝啊
    -- QQ:              154674958
    -- Email:           yc_mingzi@tom.com
    -- MSN:             chongchong2008@msn.com
    -- Create Date:     2009-11-13
    -- =============================================
    ALTER FUNCTION [dbo].[fn_chongchong_ReversOrder]
    (
        @orderFields nvarchar(255)
    )
    RETURNS nvarchar(256)
    AS
        BEGIN

            declare @sourceString nvarchar(255)
            declare @resultString nvarchar(255)
            declare @tempString nvarchar(32)
           declare @index int
            declare @len int
            declare @len2 int

            set @sourceString = @orderFields + ',';

            --计算长度
            set @len = len(@sourceString)
            set @index = CHARINDEX(',', @sourceString)
            set @resultString = ''

            --循环
            while(@index!=0)
            BEGIN
                set @tempString = SUBSTRING(@sourceString, 1, @index-1)

                if( CHARINDEX('desc', @tempString) !=0 )
                    SET @tempString = replace(@tempString,'desc','ASC')
                else
                    SET @tempString = replace(@tempString,'asc','DESC')

                SET @resultString = @resultString + @tempString+ ',' ;

                SET @sourceString = SUBSTRING(@sourceString, @index+1, @len-@index)
                SET @index = CHARINDEX(',', @sourceString)
            END

            SET @len2 = len(@resultString)
            SET @resultString = substring(@resultString,1,@len2-1)

     RETURN @resultString

        END

    此SQL函数的功能如下:(用来反转任意多个排序字段的排序方式)

    declare @strSource nvarchar(255)
    set @strSource = dbo.fn_chongchong_ReversOrder('test_OrderID ASC,test_OtherID DESC,test_Date DESC')
    print @strSource

    返回输出 test_OrderID DESC,test_OtherID ASC,test_Date ASC

 

    利用第二种方法写出如下的代码:

        SET @orderKey = @orderKey + CASE @orderType WHEN  0 THEN ' ASC' ELSE ' DESC' END;
 SET @orderKeyRevers = dbo.fn_chongchong_ReversOrder(@orderKey); -- 反转
        SET @orderFields = replace(replace(@orderKey,'ASC',''),'DESC',''); --去掉排序标记符

        SET @strSQL = 'SELECT ' + @fieldNameList + ' FROM ' + @tableName
                          + @where1 + @primaryKey + 'in('
                              +'SELECT TOP '+ CAST(@pageSize as varchar) + @primaryKey + ' FROM ('
                                  +'SELECT TOP '+ CAST(@pageSize*(@pageIndex) as varchar) + @orderFields +' FROM '+ @tableName
                                  + @where2 + ' ORDER BY ' + @orderKey
                              + ') t ORDER BY '+ @orderKeyRevers
                          + ') order by ' + @orderKey;

    注意这种方法,当翻页到最后一页的时候有个Bug,下面这段用来修正这个Bug.

        IF(@pageIndex >= @totalPage) -- 修正第后一页
            SET @strSQL = 'SELECT ' + @fieldNameList + ' FROM ' + @tableName + @where1 + @primaryKey + 'in('
                                + 'SELECT TOP ' + CAST(@lastRecords as varchar) +  @primaryKey + ' FROM '+ @tableName + ' ORDER BY ' + @orderKey + + CASE @orderType WHEN  0 THEN ' DESC' ELSE ' ASC' END
                              +') order by ' + @orderKey + CASE @orderType WHEN  0 THEN ' ASC' ELSE ' DESC' END;

 

    OK,就是这样...

 

抱歉!评论已关闭.