Подтвердить что ты не робот

Внедрение подкачки (skip/take) с помощью этого запроса

Я немного пытался понять, как реализовать пользовательский пейджинг в SQL, например, читать статьи, подобные этому.

У меня есть следующий запрос, который отлично работает. Но я хотел бы реализовать пейджинг с этим.

SELECT TOP x PostId FROM ( SELECT PostId, MAX (Datemade) as LastDate
 from dbForumEntry 
 group by PostId ) SubQueryAlias
 order by LastDate desc

Что я хочу

У меня есть сообщения на форуме с соответствующими записями. Я хочу получить сообщения с последними добавленными записями, поэтому я могу выбрать недавно обсуждаемые сообщения.

Теперь я хочу, чтобы получить "топ-10 до 20 последних активных сообщений" вместо "топ-10".

Что я пробовал

Я попытался реализовать функции ROW, как в статье, но на самом деле не повезло.

Любые идеи, как его реализовать?

4b9b3361

Ответ 1

В SQL Server 2012 очень легко

SELECT col1, col2, ...
 FROM ...
 WHERE ... 
 ORDER BY -- this is a MUST there must be ORDER BY statement
-- the paging comes here
OFFSET     10 ROWS       -- skip 10 rows
FETCH NEXT 10 ROWS ONLY; -- take 10 rows

Если мы хотим пропустить ORDER BY, мы можем использовать

SELECT col1, col2, ...
  ...
 ORDER BY CURRENT_TIMESTAMP
OFFSET     10 ROWS       -- skip 10 rows
FETCH NEXT 10 ROWS ONLY; -- take 10 rows

(Я бы предпочел отметить это как взломать, но он использовался, например, NHibernate. Использовать разумно подобранный столбец как ORDER BY является предпочтительным способом)

чтобы ответить на вопрос:

--SQL SERVER 2012
SELECT PostId FROM 
        ( SELECT PostId, MAX (Datemade) as LastDate
            from dbForumEntry 
            group by PostId 
        ) SubQueryAlias
 order by LastDate desc
OFFSET 10 ROWS -- skip 10 rows
FETCH NEXT 10 ROWS ONLY; -- take 10 rows

Были введены новые ключевые слова offset и fetch next (только следующие стандарты SQL).

Но я предполагаю, что вы не используете SQL Server 2012, правильно? В предыдущей версии это немного (немного) сложно. Вот сравнение и примеры для всех версий SQL-сервера: здесь

Итак, это может работать в SQL Server 2008:

-- SQL SERVER 2008
DECLARE @Start INT
DECLARE @End INT
SELECT @Start = 10,@End = 20;


;WITH PostCTE AS 
 ( SELECT PostId, MAX (Datemade) as LastDate
   ,ROW_NUMBER() OVER (ORDER BY PostId) AS RowNumber
   from dbForumEntry 
   group by PostId 
 )
SELECT PostId, LastDate
FROM PostCTE
WHERE RowNumber > @Start AND RowNumber <= @End
ORDER BY PostId

Ответ 2

Чтобы сделать это в SQL Server, вы должны заказать запрос по столбцу, чтобы вы могли указать нужные строки.

Пример:

select * from table order by [some_column] 
offset 10 rows
FETCH NEXT 10 rows only

И при этом вы не можете использовать ключевое слово TOP.

Вы можете узнать больше здесь: https://technet.microsoft.com/pt-br/library/gg699618%28v=sql.110%29.aspx

Ответ 3

SQL 2008

Ответ Radim Köhler работает, но вот более короткая версия:

select top 20 * from
(
select *,
ROW_NUMBER() OVER (ORDER BY columnid) AS ROW_NUM
from tablename
) x
where ROW_NUM>10

Источник: https://forums.asp.net/post/4033909.aspx

Ответ 4

OFFSET     10 ROWS       -- skip 10 rows
FETCH NEXT 10 ROWS ONLY; -- take 10 rows

используйте это в конце синтаксиса выбора. =)