分页SQL语句

分页SQL语句

分页SQL语句

——独立观察员 2018.01.21

做网站开发的都知道,显示列表项过多时会采取分页。本文主要讨论分页中的SQL语句,仅供参考。

以下是C#中的参数化的SQL语句片段,展示了分页时的情况:

string strSql = @"select top(@num) *

            from (

                select id, c_info_title,

                    count(*) over() AS Total,

                    row_number() over(order by n_is_head, n_order desc, d_list_date desc, id desc) AS num

                from B_NEWS

                where n_is_active=1

            ) AS T

            where num>@index";



SqlParameter[] paras ={

    new SqlParameter("@num", perPageCount)

    new SqlParameter("@index", perPageCount*(curPage-1))

};

 

可以看出,该SQL语句中使用了嵌套查询。内层查询中使用了开窗函数over(),关于开窗函数,可参考文章《sql开窗函数over()用法》,总之,开窗函数能很方便让我们把聚集函数的值放到查询项中。话归正题,上面的SQL语句使用了count(*) over()来查询出总行数,使用row_number() over()来设置行号,其它都是常规查询。

然后是外层查询,使用top()来限定最终查询几条,参数@num传递的就是每页的条数。使用where num>@index来限定外层查询的起始位置,@index也就是当前页第一条的上一条的位置,或者说是当前页的上一页的最后一条的位置,num是内层查询出的行号。

以上就是本次介绍的分页SQL语句,再配合Ajax查询、JS翻页插件,就能实现列表页的翻页了。

接下来我们再说说详情页的SQL语句:

string sql =

    @"DECLARE @TempTable Table(num int, id int, title nvarchar(200), date varchar(100), c_info_content ntext

    

    insert into @TempTable

    select row_number() over(order by n_is_head, n_order desc, d_list_date desc, id desc) AS num, id, c_info_title AS title, CONVERT(varchar(100), d_list_date, 111) AS date, c_info_content

    from B_NEWS where n_is_active=1 and c_kind_num=@kind

    

    DECLARE @num int

    set @num=(select top(1) num from @TempTable where id=@id)

    

    select *,

        (select top(1) id from @TempTable where num=@num-1) AS id_up,

        (select top(1) id from @TempTable where num=@num+1) AS id_down,

        (select top(1) title from @TempTable where num=@num-1) AS title_up,

        (select top(1) title from @TempTable where num=@num+1) AS title_down,

        (select top(1) date from @TempTable where num=@num-1) AS date_up,

        (select top(1) date from @TempTable where num=@num+1) AS date_down

    from @TempTable where id=@id";

    

SqlParameter[] paras =

{

    new SqlParameter("@id", id),

    new SqlParameter("@kind", curKind)

};

 

该语句首先声明了一个表变量@TempTable用于存放查询的中间结果(听说表变量会有性能损失,可考虑用公用表(with as),不过公用表限制比较大,试过了,不合适)。然后将带行号的查询结果插入表变量中。第三部分是声明了一个变量@num用于存放当前要查询记录的行号。最后就是复用表变量,分别查询出当前记录数据、上一条相关信息、下一条相关信息。参数@id就是待查询记录的ID。另外,此处的”上一条”指在列表页中排列在更上面的一条,所以查询时为行号减一。

全剧终!谢谢观赏!

 

【转载请注明出处 Http://dlgcy.com】

打印本文

2条评论

独立观察员 发布于22:29 - 2018年2月5日

啦啦啦

essaypinglun 发布于22:14 - 2018年1月23日

很好的博客,赞赞。

发表评论