Можно ли получить определенный диапазон результатов? Я знаю, как сделать TOP x, но результат, который я получу, будет НАМНОГО большим, и время ожидания истечет. Я надеялся, что смогу выбрать, скажем, первые 10 000 результатов, затем следующие 10 000 и так далее. Это возможно?
Как я могу получить определенный фрагмент результатов?
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
Удивительно, почему вы думаете, что отсутствие поддержки OFFSET делает MS SQL Server притворной БД, потому что ROW_NUMBER() - это ANSI SQL, а LIMIT/OFFSET - нет.
- person Bill Karwin; 09.12.2011
@BillKarwin Да, этот комментарий был эмоциональным, но на основе множества ужасных историй об использовании сервера MSSQL ... это не промышленная мощь. Как и большинство серверного программного обеспечения Microsoft, они начинают с однопользовательского программного обеспечения и пытаются расширять его с ожидаемыми плохими последствиями. Возможно, они исправили это в последние годы.
ROW_NUMBER()
может быть ANSI (не знал этого), но это не делает его хорошей идеей. Во-первых, вы не можете просто добавить немного SQL, чтобы получить нужные вам строки. Вы должны добавить столбцы в результирующий набор и использовать SQL kung fu, чтобы заставить работать невероятно простую вещь. ИМХО это очень хромает.
- person Bohemian♦; 09.12.2011
Что ж, у каждой СУБД есть свои сильные и слабые стороны. Я не поклонник 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