一套原创的sqlserver通用分页方案 忘高人测试效率 先阿里嘎多了

boringame 2010-06-16 11:14:06
这是一种通过程序拼接sql语句的分页方案,
用户提过的sql语句不需要编写复杂的sql逻辑

诺用户提供sql如下

select * from Table1


从第5条开始,查询5条,处理后sql变为

select *
from (
select row_number()over(order by tempColumn)tempRowNumber,*
from (select top 10 tempColumn=0,* from Table1)t
)tt
where tempRowNumber>5


这是什么意思呢?分解一下

首先将用户输入的sql语句转稍稍修改
在select后添加top 开始位置+条数变成
再外加一列tempColum,变成这样

select top 20 tempColumn=0,* from Clazz

嵌套一层,这样便可查询出行号
刚才那个列就是用来这里order by用的
(也不知道SqlServer的row_number函数为什么必须要order by)

select row_number()over(order by tempColumn)tempRowNumber,*
from (修改过的查询)t

再套一层,过滤掉行号小于开始位置的行

select * from (第二层)tt
where tempRowNumber>10


各位高人,懂得帮我测试一下效率。
...全文
2295 41 打赏 收藏 转发到动态 举报
写回复
用AI写文章
41 条回复
切换为时间正序
请发表友善的回复…
发表回复
JHX998 2010-06-24
  • 打赏
  • 举报
回复
学习了.
boringame 2010-06-24
  • 打赏
  • 举报
回复
[Quote=引用 39 楼 ka_wa_yi12 的回复:]
这东西就是类似oracle的rownum
[/Quote]
是啊
ka_wa_yi12 2010-06-24
  • 打赏
  • 举报
回复
[Quote=引用 38 楼 ka_wa_yi12 的回复:]
引用 10 楼 xys_777 的回复:
select *
from (
select row_number()over(order by getdate())tempRowNumber,*
from Table1 )t
where tempRowNumber>5 and tempRowNumber<=10


这样能好些


牛叉!!!!!!!!!!!!!!!!!!!!!!……
[/Quote]


这东西就是类似oracle的rownum
ka_wa_yi12 2010-06-24
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 xys_777 的回复:]
select *
from (
select row_number()over(order by getdate())tempRowNumber,*
from Table1 )t
where tempRowNumber>5 and tempRowNumber<=10


这样能好些
[/Quote]

牛叉!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
SamuDra 2010-06-22
  • 打赏
  • 举报
回复
mark
fuxiuhua 2010-06-21
  • 打赏
  • 举报
回复
写出来了。。怎么用呀。。。。说说。。请教。。
taixz072330 2010-06-20
  • 打赏
  • 举报
回复
关注一下!
越过越咸 2010-06-19
  • 打赏
  • 举报
回复
http://demo.naturefw.com/login.aspx
智星 2010-06-19
  • 打赏
  • 举报
回复
学习了.
沐NeMo 2010-06-19
  • 打赏
  • 举报
回复
围观学习......
dongfangbai 2010-06-18
  • 打赏
  • 举报
回复
学习了!
showjim 2010-06-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 boringame 的回复:]
引用 2 楼 wuyq11 的回复:
ROW_NUMBER
返回结果集分区内行的序列号,每个分区的第一行从 1 开始四种分页算法的效率比较

我这个好像是颠倒top和row_number合体版本耶。。。疑惑了

能不能具体指教一下会有什么效率问题
[/Quote]
颠倒top为什么高效?因为对于不合法的数据只从硬盘读取了KEY的列表,而不是*。
所以LZ的版本与颠倒top没有关系
正宗熊猫哥 2010-06-17
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 xys_777 的回复:]
select *
from (
select row_number()over(order by getdate())tempRowNumber,*
from Table1 )t
where tempRowNumber>5 and tempRowNumber<=10


这样能好些
[/Quote]

这个方法学习了。。UP
51Crack 2010-06-17
  • 打赏
  • 举报
回复
mck477 2010-06-17
  • 打赏
  • 举报
回复
顶顶顶,顶上去
zhoubupt 2010-06-17
  • 打赏
  • 举报
回复
汗颜,好多都没看过
guyehanxinlei 2010-06-17
  • 打赏
  • 举报
回复
Friendly Up!
xk1126 2010-06-17
  • 打赏
  • 举报
回复
帮顶,带学习了!~
捷哥1999 2010-06-17
  • 打赏
  • 举报
回复
分两贴发?
再学习一次?
boringame 2010-06-17
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 xys_777 的回复:]
select *
from (
select row_number()over(order by getdate())tempRowNumber,*
from Table1 )t
where tempRowNumber>5 and tempRowNumber<=10


这样能好些
[/Quote]

高手啊。。。我之前都不知道可以用getdate()的,呵呵。

但是我测试了一下效率,不如我原来的快哦。不明原因。
加载更多回复(20)

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧