Есть ли эквивалент "START AT" в MS-SQL?

некоторые базы данных поддерживают такие команды, как:

SELECT TOP 10 START AT 10 * FROM <TABLE>

по существу, мне нужно вытащить первые 10 записей, затем следующие 10, затем следующие 10 и т. д. Возможно, есть другой способ сделать это, но в прошлом я делал это, как указано выше, для баз данных, поддерживающих "START AT".

4 ответов


какая версия SQL Server?

в SQL Server 2000 это настоящая боль (хотя возможно использование уродливых трюков, как это опубликовано stingyjack).

в 2005 году и позже это немного проще-посмотрите на функции row_number()


на SQL Server 2012

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

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

Если вы хотите быть совместимы с 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;