zoukankan      html  css  js  c++  java
  • sql中的分页实现

    1.两种方式

      1.1:row_number() over()函数

    SELECT TOP 页大小 *
       FROM( SELECT ROW_NUMBER() OVER (ORDER BY id) AS RowNumber,* FROM table1 )as A 
       WHERE RowNumber > 页大小*(页数-1)
       
       --注解:首先利用Row_number()为table1表的每一行添加一个行号,给行号这一列取名'RowNumber' 在over()方法中将'RowNumber'做了升序排列
       --然后将'RowNumber'列 与table1表的所有列 形成一个表A
       --重点在where条件。假如当前页(currentPage)是第2页,每页显示10个数据(pageSzie)。那么第一页的数据就是第11-20条
       --所以为了显示第二页的数据,即显示第11-20条数据,那么就让RowNumber大于 10*(2-1)

      1.2:OFFSET ....FETCH 

            OFFSET { integer_constant | offset_row_count_expression } { ROW | ROWS }

            指定在从查询表达式中开始返回行之前,将跳过的行数。OFFSET 子句的参数可以是大于或等于零的整数或表达式。ROW 和 ROWS 可以互换使用。

            FETCH { FIRST|NEXT } <行计数表达式> { ROW|ROWS } ONLY

          指定在处理 OFFSET 子句后,将返回的行数。FETCH 子句的参数可以是大于或等于 1 的整数或表达式。ROW 和 ROWS 可以互换使用。同样,FIRST 和 NEXT 可以互换使用。

    每页10条,查询第10页的数据

    select * from (select row_number() over(order by U_sortNo) as Rm,* from A01 where u_areacode='130000') as t where 100<Rm and Rm<=110

    SELECT A0100,COUNT(1) OVER() AS total
    FROM A01
    where u_areacode='130000'
    ORDER BY U_sortNo
    OFFSET 100 ROWS FETCH NEXT 10 ROWS ONLY

    说明跳过100行不包括第100条数据,并查出来之后的10的数据,也就是101-110中的十条数据

            /// 分页
            /// </summary>
            /// <param name="pageIndex">获取当前页码默认为1</param>
            /// <param name="pageSize">获取每页显示多少条记录</param>
            public string GetUserList(int pageIndex, int pageSize,string orderField, string orderType)
            {
                int count;
                string sql = @"select a.*,b.Title,b.Content from Power_user a
    left join Knowledge b on a.ID = b.CreateUserID";
                string strsql = string.Format("select * from ({0}) T_TT  where 1=1 ", sql);
                StringBuilder stringBuilder = new StringBuilder();
                int num = (pageIndex-1) * pageSize;
                int num2 = pageIndex * pageSize;
                string str;
                if (!string.IsNullOrEmpty(orderField))
                {
                    str = "Order By " + orderField + " " + orderType;
                }
                else
                {
                    str = "order by (select 0)";
                }
                stringBuilder.Append("Select * From (Select ROW_NUMBER() Over (" + str + ")");
                stringBuilder.Append(string.Concat(new object[]
                {
                    " As rowNum, * From (",
                    strsql,
                    ") As T ) As N Where rowNum > ",
                    num,
                    " And rowNum <= ",
                    num2
                }));
                count = System.Convert.ToInt32(SqlHelper.ExecuteScalar(SqlHelper.ConnectionString, CommandType.Text, "Select Count(1) From (" + strsql + ") As t", null)); ;
                DataTable dt = SqlHelper.ExecuteDataTable(SqlHelper.ConnectionString, CommandType.Text, stringBuilder.ToString(), null);
                string Json = JsonConvert.SerializeObject(dt);
                 List<Power_User> userModel = SqlHelper.ExecuteClass<Power_User>(SqlHelper.ConnectionString, strsql, null);
                //string b = JsonConvert.SerializeObject(userModel);
                return Json;
            }

     //分页效果最差

    SELECT TOP 页大小 *
       FROM table1
       WHERE id NOT IN --where条件语句限定要查询的数据不是子查询里面包含的数据。即查询"子查询"后面的10条数据。即当前页的数据
               (
                  --如果当前页是第二页,每页显示10条数据,那么这里就是获取当前页前面的所有数据。
                  SELECT TOP 页大小*(当前页-1) id FROM table1 ORDER BY id
               )
       ORDER BY id
  • 相关阅读:
    BEGIN2 序列求和
    BEGIN2 序列求和
    《算法竞赛入门经典》 习题45 IP网络(IP Networks,ACM、ICPC NEERC 2005,UVa1590)
    C#中char空值的几种表示方式
    C#中char空值的几种表示方式
    C#中() =>是什么意思
    C#中() =>是什么意思
    C# Task 暂停与取消
    C# Task 暂停与取消
    C# WinForm设置透明
  • 原文地址:https://www.cnblogs.com/DSC1991/p/8675470.html
Copyright © 2011-2022 走看看