use*_*901 14 sql database sql-server sql-server-2008
我正在寻找这样的表达(使用SQL Server 2008)
SELECT TOP 10 columName FROM tableName
Run Code Online (Sandbox Code Playgroud)
但是我不需要10到20之间的值.我想知道是否有一种方法只使用一个SELECT语句.
例如,这是无用的:
SELECT columName FROM
(SELECT ROW_NUMBER() OVER(ORDER BY someId) AS RowNum, * FROM tableName) AS alias
WHERE RowNum BETWEEN 10 AND 20
Run Code Online (Sandbox Code Playgroud)
因为select括号内部已经返回了所有结果,并且由于性能的原因,我希望避免这种情况.
有一个技巧row_number,不涉及排序所有行.
试试这个:
SELECT columName
FROM (SELECT ROW_NUMBER() OVER(ORDER BY (select NULL as noorder)) AS RowNum, *
FROM tableName
) as alias
WHERE RowNum BETWEEN 10 AND 20
Run Code Online (Sandbox Code Playgroud)
你不能在中使用常量order by.但是,您可以使用计算结果为常量的表达式.SQL Server识别出这一点,只返回遇到的行,并正确枚举.
使用SQL Server 2012进行获取/跳过!
SELECT SalesOrderID, SalesOrderDetailID, ProductID, OrderQty, UnitPrice, LineTotal
FROM AdventureWorks2012.Sales.SalesOrderDetail
OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY;
Run Code Online (Sandbox Code Playgroud)
没有比您对较旧版本的sql server更好的描述了。也许使用CTE,但不太可能有所作为。
WITH NumberedMyTable AS
(
SELECT
Id,
Value,
ROW_NUMBER() OVER (ORDER BY Id) AS RowNumber
FROM
MyTable
)
SELECT
Id,
Value
FROM
NumberedMyTable
WHERE
RowNumber BETWEEN @From AND @To
Run Code Online (Sandbox Code Playgroud)
或者,您可以删除前10行,然后再获取前10行,但是如果有人愿意,我可以加倍。