首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

sql分页查询解决思路

2013-11-19 
sql分页查询数据如下ID HasChild Lev101201322422533601701801901100111102120113122140115142这是一个树

sql分页查询
数据如下

ID HasChild Lev
1    0       1
2    0       1
3    2       2
4    2       2
5    3       3
6    0       1
7    0       1
8    0       1
9    0       1
10   0       1
11   10      2
12   0       1
13   12      2
14   0       1
15   14      2

这是一个树形结构 我的需求是每页显示五条,但是这五条必须包括根节点和子节点 
分页效果如下
第一页:
1    0       1
2    0       1
3    2       2
4    2       2
5    3       3
6    0       1
7    0       1
8    0       1
第二页
9    0       1
10   0       1
11   10      2
12   0       1
13   12      2
14   0       1
15   14      2
sql? 分页查询
[解决办法]


select 1 ID ,0 HasChild ,1 Lev
into #temp
union all select 2  ,0  ,1
union all select 3  ,2  ,2
union all select 4  ,2  ,2
union all select 5  ,3  ,3
union all select 6  ,0  ,1
union all select 7  ,0  ,1
union all select 8  ,0  ,1
union all select 9  ,0  ,1
union all select 10 ,0  ,1
union all select 11 ,10 ,2
union all select 12 ,0  ,1
union all select 13 ,12 ,2
union all select 14 ,0  ,1
union all select 15 ,14 ,2

declare @pagenum int=1;
declare @pagerownum int=5;

with t as
(
select  id
from 
(
select top (@pagerownum*@pagenum) *,ROW_NUMBER() over(order by id) rn
from #temp
where lev=1
) t
where rn>@pagerownum*(@pagenum-1)
)
select *
from #temp
where id in(select id from t)
or haschild in (select id from t)

[解决办法]
引用:
Quote: 引用:

你的分页效果里面,第一页显示的是8行,第二页7行。你的需求是每页显示五条。这个怎么理解呢


就是说每一页显示5行根节点的数据 但是必须把子节点也查出来绑定在控件上 那样显示出来就是五行 把节点打开就是5+行了


这个根节点是lev为1的嘛,而子节点是否是这5个根节点的子节点呢
[解决办法]

create table q10
(ID int,HasChild int,Lev int)

insert into q10
 select 1, 0, 1 union all
 select 2, 0, 1 union all
 select 3, 2, 2 union all
 select 4, 2, 2 union all
 select 5, 3, 3 union all
 select 6, 0, 1 union all
 select 7, 0, 1 union all
 select 8, 0, 1 union all
 select 9, 0, 1 union all
 select 10, 0, 1 union all
 select 11, 10, 2 union all
 select 12, 0, 1 union all
 select 13, 12, 2 union all
 select 14, 0, 1 union all
 select 15, 14, 2
 
 
-- test1


declare @pageid int
select @pageid=1

;with t as
(select ID,row_number() over(order by ID) 'rn'
 from q10 where Lev=1),
u as
(select a.ID,a.HasChild,a.Lev,
        case when b.ID is not null then (b.rn-1)/5+1
             else (select top 1 (c.rn-1)/5+1 from t c
                   where c.ID<a.ID order by c.ID desc) end 'pid'
 from q10 a
 left join t b on a.ID=b.ID
)
select ID,HasChild,Lev from u where pid=@pageid

/*
ID          HasChild    Lev
----------- ----------- -----------
1           0           1
2           0           1
3           2           2
4           2           2
5           3           3
6           0           1
7           0           1
8           0           1

(8 row(s) affected)
*/


-- test2
declare @pageid int
select @pageid=2

;with t as
(select ID,row_number() over(order by ID) 'rn'
 from q10 where Lev=1),
u as
(select a.ID,a.HasChild,a.Lev,
        case when b.ID is not null then (b.rn-1)/5+1
             else (select top 1 (c.rn-1)/5+1 from t c
                   where c.ID<a.ID order by c.ID desc) end 'pid'
 from q10 a
 left join t b on a.ID=b.ID
)
select ID,HasChild,Lev from u where pid=@pageid

/*
ID          HasChild    Lev
----------- ----------- -----------
9           0           1
10          0           1
11          10          2
12          0           1
13          12          2
14          0           1
15          14          2

(7 row(s) affected)
*/


[解决办法]

if OBJECT_ID('tb') is not null
   drop table tb
go

create table tb(ID int,HasChild int,Lev int)

insert into tb
select 1,    0,       1
union all select 2  ,0  ,1
union all select 3  ,2  ,2
union all select 4  ,2  ,2
union all select 5  ,3  ,3
union all select 6  ,0  ,1
union all select 7  ,0  ,1
union all select 8  ,0  ,1
union all select 9  ,0  ,1
union all select 10 ,0  ,1
union all select 11 ,10 ,2
union all select 12 ,0  ,1
union all select 13 ,12 ,2
union all select 14 ,0  ,1
union all select 15 ,14 ,2
go


declare @page int=1;
declare @pagerownum int=5;


;with t
as
(
select id,HasChild,Lev,
       ROW_NUMBER() over(partition by case when lev = 1 then 0 else 1 end 


                             order by id) as rownum
from tb
)

select ID,HasChild,Lev 
from 
(
select *,
       case when lev = 1
                 then (rownum - 1) /  @pagerownum
            else (rownum - 1) /  3
       end as page
from t
)tt
where page = @page - 1
order by ID
/*
IDHasChildLev
101
201
322
422
533
601
701
801
*/

热点排行