Я боролся с этим все выходные и у меня нет идей.Чтобы страницы в результатах поиска были на моем веб-сайте, мне нужно вернуть подмножество строк из базы данных 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 в приведенном выше сценарии?