Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Implemente a funcionalidade de paginação (pular / tirar) com esta consulta


No SQL Server 2012 é muito muito fácil
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

Se quisermos pular ORDER BY podemos usar
SELECT col1, col2, ...
  ...
 ORDER BY CURRENT_TIMESTAMP
OFFSET     10 ROWS       -- skip 10 rows
FETCH NEXT 10 ROWS ONLY; -- take 10 rows

(Prefiro marcar isso como um hack - mas é usado, por exemplo, pelo NHibernate. Usar uma coluna sabiamente escolhida como ORDER BY é a maneira preferida)

para responder a pergunta:
--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

Novas palavras-chave offset e fetch next (apenas seguindo os padrões SQL) foram introduzidos.

Mas acho que você não está usando o SQL Server 2012 , certo ? Na versão anterior é um pouco (pouco) difícil. Aqui está a comparação e exemplos para todas as versões do SQL Server:aqui

Então, isso pode funcionar no 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