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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM