sql >> Database teknologi >  >> RDS >> Sqlserver

Implementer sidesøgning (spring over / tag) funktionalitet med denne forespørgsel

I SQL Server 2012 det er meget meget nemt

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
 

Hvis vi ønsker at springe ORDER BY over kan vi bruge

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

(Jeg vil hellere markere det som et hack - men det bruges f.eks. af NHibernate. At bruge en klogt opsamlet kolonne som BESTIL BY er den foretrukne måde)

for at besvare spørgsmålet:

--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

Nye nøgleord offset og fetch next (bare efter SQL-standarder) blev introduceret.

Men jeg gætter på, at du ikke bruger SQL Server 2012 , højre ? I tidligere version er det lidt (lidt) svært. Her er sammenligning og eksempler for alle SQL-serverversioner:her

Så dette kunne fungere i 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
 


  1. Bedste fremgangsmåder til at arbejde med flere tabeller

  2. Hvornår er det tid til at opgradere til SQL?

  3. Hvordan henter jeg mit MySQL-brugernavn og -adgangskode?

  4. Udforskning af Java Unit Testing med JUnit Test Framework