Некоторые базы данных поддерживают такие команды, как:
SELECT TOP 10 START AT 10 * FROM <TABLE>
По сути, мне нужно вытащить первые 10 записей, затем следующие 10, затем следующие 10 и т. д. Возможно, есть другой способ сделать это, но в прошлом я делал это, как указано выше, для баз данных, поддерживающих «START AT».


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?
В SQL Server 2000 это настоящая боль (хотя возможно использование уродливых уловок, подобных тому, что опубликовал stingyjack).
В 2005 году и позже это немного проще - посмотрите на функцию Row_Number ().
И, в зависимости от вашего клиентского приложения, это может быть даже не так сложно. Некоторые элементы управления сеткой ASP.Net поддерживают автоматическое разбиение на страницы.
Если вы хотите быть совместимым с 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;
Для SQL Server 2012
SELECT *
FROM <TABLE>
ORDER BY <SomeCol>
OFFSET 10 ROWS
FETCH NEXT 10 ROWS ONLY;
Приятно видеть, что SQL Server наконец-то добавляет некую спецификацию OFFSET! Этот синтаксис кажется совместимым с DB2, Derby и Ingres ...
@LukasEder - это стандарт SQL: 2008 Насколько мне известно
Хм, в последний черновик SQL: 2008, который я видел не упоминается такое расширение для <order by clause> (стр. 837 в 5CD2-02-Foundation-2006-01.pdf). Но это всего лишь черновик, поэтому, возможно, в окончательном стандартном документе SQL: 2008 они, возможно, действительно добавили этот пункт ...? Комментарии можно редактировать только в течение 5 минут (щелкните это поле, чтобы отклонить)
@LukasEder - Не знаю. Я просто отклонился от того, что говорит моя предыдущая ссылка. У меня тоже нет доступа к копии.
Мне любопытно, какие базы данных, кроме Sybase SQL Anywhere, поддерживают предложение
START AT?