SQL2005 分页

春三十一郎 2006-02-14 04:41:49
select threadid from
(
select threadid, ROW_NUMBER() OVER (order by stickydate) as Pos from cs_threads
) as T
where T.Pos > 100000 and T.Pos < 100030


这个怎么用?
...全文
171 点赞 收藏 11
写回复
11 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
春三十一郎 2006-02-17
搞懂了,用这个查的话,分页程序要改写,效率应该会高很多很多。
回复
zjcxc 2006-02-15
"如果现在我有一简单的 Select * Form 表 数据量大翻页慢,那上面的句子该怎么写?"

就是在你的select fieldliset中增加一个row_number的列, 再通过子查询或者cte封装在条件中引用row_number列做条件.

因为row_number不能直接用于条件, 所以得用子查询或者cte包装一下.
回复
春三十一郎 2006-02-15
UP
回复
春三十一郎 2006-02-15
如果现在我有一简单的 Select * Form 表 数据量大翻页慢,那上面的句子该怎么写?没用存储过程。
回复
ashzs 2006-02-15
我做了个2005的分页程序,只是把原来的临时表生成序号部分改成了row_number了。效率还可以。由于动态SQL用CTE太麻烦,所以还是用的子查询。
回复
ReViSion 2006-02-14
好好学习,天天向上
回复
ashzs 2006-02-14
viptiger(六嘎),用的是CTE也是新特性。
回复
ashzs 2006-02-14
row_number函数是SQL2005 rank函数集中比较重要的一个。它有点类似oracle的rownumber。但是它比oracle的rownumber在嵌套查询方面更方便一点。有了row_number函数分页就可以不用使用临时表或表变量提供顺序号了!效率提高很多!

摘抄自帮助文件:

《-------------------------------------
ROW_NUMBER (Transact-SQL)

返回结果集分区内行的序列号,每个分区的第一行从 1 开始。



Transact-SQL 语法约定
语法

复制到剪贴板ROW_NUMBER ( ) OVER ( [ <partition_by_clause> ] &lorder_by_clause > )
备注

ORDER BY 子句可确定在特定分区中为行分配唯一 ROW_NUMBER 的顺序。

参数

<partition_by_clause>

将 FROM 子句生成的结果集划入应用了 ROW_NUMBER 函数的分区。

<order_by_clause>

确定将 ROW_NUMBER 值分配给分区中的行的顺序。有关详细信息,请参阅 ORDER BY 子句 (Transact-SQL)。

有关详细信息,请参阅 OVER 子句 (Transact-SQL)。

返回类型

bigint

示例

以下示例将根据年初至今的销售额,返回 AdventureWorks 中销售人员的 ROW_NUMBER。


SELECT c.FirstName, c.LastName, ROW_NUMBER() OVER(ORDER BY SalesYTD DESC) AS 'Row Number', s.SalesYTD, a.PostalCode
FROM Sales.SalesPerson s JOIN Person.Contact c on s.SalesPersonID = c.ContactID
JOIN Person.Address a ON a.AddressID = c.ContactID
WHERE TerritoryID IS NOT NULL AND SalesYTD <> 0
以下示例将返回行号为 50 到 60(含)的行,并以 OrderDate 排序。


WITH OrderedOrders AS
(SELECT SalesOrderID, OrderDate,
ROW_NUMBER() OVER (order by OrderDate)as RowNumber
FROM Sales.SalesOrderHeader )
SELECT *
FROM OrderedOrders
WHERE RowNumber between 50 and 60;

-----------------------》
回复
子陌红尘 2006-02-14
没用过SQL Server 2005,感觉他的分析函数跟Oracle很类似。
楼上的SQL语句语法没有错误吧?


ROW_NUMBER() OVER (order by stickydate) as Pos
-------------------------------------------------------------------------------------
按照stickydate字段排序,编号自1开始顺序排列,为该列取别名为Pos


余下部分的SQL语句很好理解,就是一个对子查询结果按范围取值的操作。
回复
viptiger 2006-02-14

with xxx as
(
select threadid, ROW_NUMBER() OVER (order by stickydate) as Pos from cs_threads
)
select * from xxx
where Pos > 100000 and Pos < 100030
回复
-狙击手- 2006-02-14
没玩过2005 ,帮顶
回复
相关推荐
发帖
疑难问题
创建于2007-09-28

2.1w+

社区成员

MS-SQL Server 疑难问题
申请成为版主
帖子事件
创建了帖子
2006-02-14 04:41
社区公告
暂无公告