Как эффективно ограничить возвращаемые строки в SQL Server 2000 (возвращать строки от X до Y)? - PullRequest
1 голос
/ 25 февраля 2011

Я работаю в системе, которая должна быть совместима с MS SQL Server 2000 (да, отстой, но скажи это нашим клиентам, которые все еще используют его).В любом случае, я столкнулся с этим препятствием на пути к ситуации ...

Есть эта таблица, в которой может быть много записей (на самом деле таблица продуктов).У одного из наших клиентов даже около 1М записей.Я строю интернет-магазин, и мне нужно отобразить записи из этой таблицы.Естественно, я должен предоставлять пейджинг в Интернете, поэтому мне нужна опция, чтобы выбирать только записи от X до Y.

Но как это сделать так, чтобы это было и эффективно, и работало даже в SQLServer 2000?

Ответы [ 4 ]

4 голосов
/ 25 февраля 2011

Единственное частично работоспособное решение для большой таблицы на SQL Server 2000, о котором я знаю, это шаблон

SELECT TOP 100 *
  FROM products p1
  WHERE p1.productID not in (SELECT TOP 200 productID FROM products p2)

. Это отобразит строки 201-300.

Если упорядочение и фильтрациятребуется (и обычно это так), вам нужно убедиться, что порядок и фильтр одинаковы как в запросе, так и в подзапросе (в противном случае результаты выглядят немного странно), например

SELECT TOP 100 *
  FROM products p1
  WHERE p1.productID not in (SELECT TOP 200 productID 
                               FROM products p2 
                               WHERE p2.productGroup = 2
                               ORDER BY p2.productName)
    AND p1.productGroup = 2
  ORDER BY p1.productName

(это возвращаетПродукт 201–300, где группа productGroup имеет 2 упорядоченные по имени).

Недостатком этого подхода является то, что SQL Server 2000 не поддерживает синтаксис TOP @variable, поэтому значения 100 и 200 в приведенном выше запросе не могут быть легкоparametricized.Чтобы сгенерировать этот запрос, вам нужно будет либо использовать SP, который будет использовать динамический SQL, либо скомпилировать его в клиентском приложении, а затем отправить его в базу данных как есть.

В несвязанной речи я всегдаИнтересно, почему это не поддерживается на уровне базы данных, например, что-то вроде

SELECT ROW 201-300 *
  FROM products
  WHERE....

, поскольку этот сценарий появляется снова и снова.

2 голосов
/ 25 февраля 2011

У SWeko хороший ответ, и это была моя первая мысль.Если вы не хотите иметь подзапрос, вы можете:

SET ROWCOUNT @Y

SELECT *
FROM products p1    
WHERE p1.productID > @X
ORDER BY p1.productID

SET ROWCOUNT 0

Хотя вам придется помнить @X, который может не быть целым числом или личностью.

0 голосов
/ 19 ноября 2018

Я нашел этот ответ при поиске аналогичного решения:

SELECT
    product_name,
    list_price
FROM
    production.products
ORDER BY
    list_price,
    product_name 
OFFSET 10 ROWS 
FETCH NEXT 10 ROWS ONLY;

Полное объяснение доступно здесь .

0 голосов
/ 25 февраля 2011

Мы использовали следующую технику:

SELECT TOP @top * FROM ...

Где @top равно (Y).Таким образом, SQL Server выбирает только верхние строки, чтобы получить ожидаемую страницу, мы использовали простую выборку без извлечения данных (до X)

...