没用过SQL Server 2005,感觉他的分析函数跟Oracle很类似。 楼上的SQL语句语法没有错误吧? ROW_NUMBER() OVER (order by stickydate) as Pos ------------------------------------------------------------------------------------- 按照stickydate字段排序,编号自1开始顺序排列,为该列取别名为Pos 余下部分的SQL语句很好理解,就是一个对子查询结果按范围取值的操作。
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;-----------------------》
viptiger(六嘎),用的是CTE也是新特性。
如果现在我有一简单的 Select * Form 表 数据量大翻页慢,那上面的句子该怎么写?没用存储过程。
"如果现在我有一简单的 Select * Form 表 数据量大翻页慢,那上面的句子该怎么写?"就是在你的select fieldliset中增加一个row_number的列, 再通过子查询或者cte封装在条件中引用row_number列做条件.因为row_number不能直接用于条件, 所以得用子查询或者cte包装一下.
楼上的SQL语句语法没有错误吧?
ROW_NUMBER() OVER (order by stickydate) as Pos
-------------------------------------------------------------------------------------
按照stickydate字段排序,编号自1开始顺序排列,为该列取别名为Pos
余下部分的SQL语句很好理解,就是一个对子查询结果按范围取值的操作。
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;-----------------------》