Как я могу получить определенный фрагмент результатов?

Можно ли получить определенный диапазон результатов? Я знаю, как сделать TOP x, но результат, который я получу, будет НАМНОГО большим, и время ожидания истечет. Я надеялся, что смогу выбрать, скажем, первые 10 000 результатов, затем следующие 10 000 и так далее. Это возможно?


person user1076439    schedule 09.12.2011    source источник
comment
Какой сервер вы используете?   -  person Bohemian♦    schedule 09.12.2011


Ответы (2)


Практически во всех реализациях БД SQL есть способ указать возвращаемую начальную строку, а также количество строк.

Например, и в mysql, и в postgres это выглядит так:

SELECT ...
ORDER BY something -- not required, but highly recommended
LIMIT 100 -- only get 100 rows
OFFSET 500; -- start at row 500

Обратите внимание, что обычно вы включаете ORDER BY, чтобы убедиться, что ваши фрагменты непротиворечивы.

MS SQL Server (будучи «притворной» БД) не поддерживает OFFSET напрямую, но его можно закодировать с помощью ROW_NUMBER() - см. это сообщение SO для более подробной информации.

person Bohemian♦    schedule 09.12.2011
comment
Удивительно, почему вы думаете, что отсутствие поддержки OFFSET делает MS SQL Server притворной БД, потому что ROW_NUMBER() - это ANSI SQL, а LIMIT/OFFSET - нет. - person Bill Karwin; 09.12.2011
comment
@BillKarwin Да, этот комментарий был эмоциональным, но на основе множества ужасных историй об использовании сервера MSSQL ... это не промышленная мощь. Как и большинство серверного программного обеспечения Microsoft, они начинают с однопользовательского программного обеспечения и пытаются расширять его с ожидаемыми плохими последствиями. Возможно, они исправили это в последние годы. ROW_NUMBER() может быть ANSI (не знал этого), но это не делает его хорошей идеей. Во-первых, вы не можете просто добавить немного SQL, чтобы получить нужные вам строки. Вы должны добавить столбцы в результирующий набор и использовать SQL kung fu, чтобы заставить работать невероятно простую вещь. ИМХО это очень хромает. - person Bohemian♦; 09.12.2011
comment
Что ж, у каждой СУБД есть свои сильные и слабые стороны. Я не поклонник Microsoft, но я понимаю, что SQL Server делает удивительные вещи с оптимизацией запросов. Он используется для некоторых известных веб-сайтов, включая Stack Overflow. :-) - person Bill Karwin; 09.12.2011

WITH Q AS (
  SELECT ROW_NUMBER() OVER (ORDER BY ...some column) AS N, ...other columns
  FROM ...some table
) SELECT * FROM Q WHERE N BETWEEN 1 AND 10000;

Узнайте больше о ROW_NUMBER() здесь: http://msdn.microsoft.com/en-us/library/ms186734.aspx

person Bill Karwin    schedule 09.12.2011