Разбивка на страницы SQL Server без row_number () или вложенных подзапросов? - PullRequest
0 голосов
/ 26 сентября 2011

Я боролся с этим все выходные и у меня нет идей.Чтобы страницы в результатах поиска были на моем веб-сайте, мне нужно вернуть подмножество строк из базы данных SQL Server 2005 Express (т.е. начать со строки 20 и дать мне следующие 20 записей).В MySQL вы бы использовали ключевое слово «LIMIT», чтобы выбрать, с какой строки начинать и сколько строк возвращать.

В SQL Server я обнаружил ROW_NUMBER () / OVER, но когда я пытаюсь его использовать, он говорит: «Over not Поддерживается».Я думаю, это потому, что я использую SQL Server 2005 Express (бесплатная версия).Может кто-нибудь проверить, правда ли это или есть какая-то другая причина, по которой предложение OVER не будет поддерживаться?

Затем я обнаружил, что версия старой школы похожа на:

SELECT TOP X * FROM TABLE WHERE ID NOT IN (SELECT TOP Y ID FROM TABLE ORDER BY ID) ORDER BY ID, где X =число на страницу и Y = с какой записи начинать.

Однако мои запросы намного сложнее со многими внешними объединениями и иногда упорядочены по чему-то другому, чем то, что находится в основной таблице.Например, если кто-то решит упорядочить количество видео, которое опубликовал пользователь, запрос может выглядеть следующим образом:

SELECT TOP 50 iUserID, iVideoCount FROM MyTable LEFT OUTER JOIN (SELECT count(iVideoID) AS iVideoCount, iUserID FROM VideoTable GROUP BY iUserID) as TempVidTable ON MyTable.iUserID = TempVidTable.iUserID WHERE iUserID NOT IN (SELECT TOP 100 iUserID, iVideoCount FROM MyTable LEFT OUTER JOIN (SELECT count(iVideoID) AS iVideoCount, iUserID FROM VideoTable GROUP BY iUserID) as TempVidTable ON MyTable.iUserID = TempVidTable.iUserID ORDER BY iVideoCount) ORDER BY iVideoCount

Проблема заключается в строке подзапрос SELECT:TOP 100 iUserID, iVideoCount

Чтобы использовать предложение «NOT IN», кажется, что в подзапросе может быть только 1 столбец («SELECT TOP 100 iUserID FROM ...»).Но когда я не включаю iVideoCount в этот оператор SELECT подзапроса, тогда ORDER BY iVideoCount в подзапросе не упорядочивается правильно, поэтому мой подзапрос упорядочен не так, как мой родительский запрос, что делает эту вещь бесполезной.Есть еще около 5 таблиц, связанных внешними объединениями, которые могут сыграть роль в заказе.

Я в растерянности!Два вышеописанных метода - это единственные два способа, которыми я могу найти, чтобы SQL Server возвратил подмножество строк.Я готов вернуть весь результат и просмотреть каждую запись в PHP, но отобразить только те, которые мне нужны.Это такой неэффективный способ, это действительно мое последнее средство.

Есть какие-нибудь идеи о том, как сделать так, чтобы SQL Server имитировал условие LIMIT MySQL в приведенном выше сценарии?

1 Ответ

0 голосов
/ 07 сентября 2015

К сожалению, хотя SQL Server 2005 Row_Number () можно использовать для подкачки страниц и с подкачки данных в SQL Server 2012 улучшена с помощью Упорядочить по смещению и Выбрать далее, если выне может использовать ни одно из этих решений, которое вам требуется, чтобы сначала

  1. создать временную таблицу со столбцом идентификаторов.
  2. , а затем вставить данные в временную таблицу с помощью предложения ORDER BY
  3. Используйте значение столбца Identity временной таблицы точно так же, как значение ROW_NUMBER ()

Надеюсь, это поможет,

...