当前位置: 代码迷 >> Sql Server >> SQL分页有关问题
  详细解决方案

SQL分页有关问题

热度:6   发布时间:2016-04-27 11:17:18.0
SQL分页问题
展示一个用户关系,多级的
数据格式如下

ID ParentID Level OrderNum
960 878 1 2
961 960 2 3
962 961 3 4
963 878 1 7
964 963 2 8
965 964 3 9
966 963 2 11
967 878 1 13
968 878 1 14
969 878 1 15

请问根据 level 字段来进行分页,orderNum排序不能变

比如 按2个用户分页
第一页数据如下
ID ParentID Level OrderNum
960 878 1 2
961 960 2 3
962 961 3 4
963 878 1 7
964 963 2 8
965 964 3 9
966 963 2 11

第二页
967 878 1 13
968 878 1 14

第三页
969 878 1 15

在线等答案!!

------解决方案--------------------
SQL code
IF OBJECT_ID('T') IS NOT NULL    DROP TABLE TCREATE TABLE T(ID INT, ParentID INT, LEVEL INT,OrderNum int)--测试数据INSERT INTO TSELECT 960, 878, 1, 2 UNION ALLSELECT 961, 960, 2 ,3 UNION ALLSELECT 962, 961, 3 ,4 UNION ALLSELECT 963, 878, 1 ,7 UNION ALLSELECT 964, 963, 2 ,8 UNION ALLSELECT 965, 964, 3 ,9 UNION ALLSELECT 966, 963, 2 ,11 UNION ALLSELECT 967, 878, 1 ,13 UNION ALLSELECT 968, 878, 1 ,14 UNION ALLSELECT 969, 878, 1 ,15 CREATE PROC sp_getUser(    @level INT ,--每页几个用户    @PageIndex int--页面索引)AS BEGIN DECLARE @_tab TABLE (id INT IDENTITY(1,1),startIndex INT, endIndex INT,userID INT) DECLARE @_startIndex INT DECLARE @_endIndex INT  ;WITH cte AS  (    SELECT  [主ID]=ID, *     FROM T     WHERE [LEVEL]=1        UNION ALL    SELECT [主ID]=c.[主ID],a.* FROM T a JOIN cte c ON a.ParentID =c.Id     )  INSERT INTO  @_tab  SELECT MIN(id),MAX(id),[主ID] FROM cte GROUP BY [主ID] -- ORDER BY OrderNum  --每页的开始索引  SELECT @_startIndex=startIndex   FROM    (    SELECT *    FROM  @_tab    WHERE id BETWEEN @[email protected] AND @[email protected]  ) AS t  WHERE [email protected][email protected]  --每页的结束索引  SELECT @_endIndex=endIndex  FROM    (    SELECT *    FROM  @_tab    WHERE id BETWEEN @[email protected]  AND @[email protected]  ) AS t  WHERE [email protected][email protected]    PRINT 'start:'+ CAST(@_startIndex AS VARCHAR )  PRINT 'end:'+CAST(@_endIndex AS VARCHAR )    IF @_endIndex IS NULL OR LEN(@_endIndex)=0  BEGIN      SELECT * FROM T WHERE  id >=@_startIndex  END  ELSE  BEGIN      SELECT * FROM T WHERE id BETWEEN @_startIndex AND @_endIndex  END    END--每页2个用户,第一页EXEC sp_getUser 2,1/*ID          ParentID    LEVEL       OrderNum----------- ----------- ----------- -----------960         878         1           2961         960         2           3962         961         3           4963         878         1           7964         963         2           8965         964         3           9966         963         2           11(7 行受影响)*/--每页2个用户,第二页EXEC sp_getUser 2,2/*ID          ParentID    LEVEL       OrderNum----------- ----------- ----------- -----------967         878         1           13968         878         1           14(2 行受影响)*/--每页2个用户,第三页EXEC sp_getUser 2,3/*ID          ParentID    LEVEL       OrderNum----------- ----------- ----------- -----------969         878         1           15(1 行受影响)*/
  相关解决方案