使用一个select语句返回特定范围之间的行

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括号内部已经返回了所有结果,并且由于性能的原因,我希望避免这种情况.

Gor*_*off 9

有一个技巧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识别出这一点,只返回遇到的行,并正确枚举.


RAS*_*RAS 6

使用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行,但是如果有人愿意,我可以加倍。