MS-SQL中是否有类似于“START AT”的功能?

11

一些数据库支持如下命令:

SELECT TOP 10 START AT 10 * FROM <TABLE>

我需要获取前10条记录,然后是接下来的10条,再然后是下一个10条,以此类推。也许还有别的方法可以做到这一点,但之前我在支持“START AT”功能的数据库上就是像上面所述这样做的。


我很好奇,除了Sybase SQL Anywhere之外,还有哪些数据库支持START AT子句? - Lukas Eder
4个回答

9

对于SQL Server 2012

SELECT * 
FROM <TABLE>
ORDER BY <SomeCol>
OFFSET 10 ROWS
FETCH NEXT 10 ROWS ONLY;

很高兴看到SQL Server终于添加了某种指定“OFFSET”的语法!这个语法似乎与DB2、Derby和Ingres兼容... - Lukas Eder
@LukasEder - 据我所知,这是SQL:2008标准。AFAIK - Martin Smith
嗯,我看过的最后一个SQL:2008草案没有提到在<order by clause>中添加这样的扩展(见5CD2-02-Foundation-2006-01.pdf中的第837页)。但那只是一个草案,所以也许在最终的SQL:2008标准文档中,他们实际上已经添加了那个子句...?评论只能在5分钟内编辑(点击此框以关闭) - Lukas Eder
@LukasEder - 不知道。我只是根据我的先前链接所说的去做。我也没有访问权限。 - Martin Smith

5

需要使用哪个版本的SQL Server?

在SQL Server 2000中,这是一项真正的痛苦(尽管可以使用像stingyjack发布的丑陋技巧等方法来实现)。

在2005年及以后的版本中,它变得更容易了-查看Row_Number()函数。

而且,根据您的客户端应用程序,它甚至可能不那么困难。一些ASP.Net网格控件支持自动分页。


4
SELECT Top 10 * 
FROM Table 
WHERE <primary key> Not IN (
    SELECT Top 10 <primaryKey> 
    FROM Table 
    ORDER BY <primary Key> ASC) 
ORDER BY <primary Key> ASC

4

如果您想与SQL Server 2000兼容,可以使用以下方法:

SELECT * FROM
(
    SELECT TOP 10 FROM
    (
        SELECT TOP (n * 10) FROM <table> ORDER BY (column) ASC
    ) AS t1 ORDER BY (column) DESC
) AS t2 ORDER BY (column) ASC

在 SQL Server 2005 中,有一个新的函数 Row_Number()。你可以这样使用:

WITH Orders AS 
(
     SELECT SalesOrderID, OrderDate, 
     ROW_NUMBER() OVER (order by OrderDate) AS 'RowNumber' 
     FROM SalesOrder
) 
SELECT * 
FROM Orders 
WHERE RowNumber between 10 and 19;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接