it-swarm.com.de

Implementieren Sie die Paging-Funktion (Skip/Take) mit dieser Abfrage

Ich habe versucht, ein wenig zu verstehen, wie man das benutzerdefinierte Paging in SQL implementiert, zum Beispiel das Lesen von Artikeln wie diesem .

Ich habe die folgende Abfrage, die perfekt funktioniert. Ich möchte jedoch Paging mit diesem implementieren.

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

Was will ich

Ich habe Forenbeiträge mit verwandten Einträgen. Ich möchte die Beiträge mit den neuesten hinzugefügten Einträgen erhalten, so dass ich die kürzlich diskutierten Beiträge auswählen kann.

Jetzt möchte ich in der Lage sein, die "Top 10 bis 20 kürzlich aktiven Beiträge" anstelle von "Top 10" zu erhalten.

Was habe ich ausprobiert

Ich habe versucht, die ROW-Funktionen als die im Artikel zu implementieren, aber wirklich ohne Erfolg. 

Irgendwelche Ideen, wie man es umsetzen kann?

97
Lars Holdgaard

In SQL Server 2012 ist das sehr einfach 

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

Wenn wir ORDER BY überspringen wollen, können wir verwenden

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

(Ich würde das lieber als Hack kennzeichnen - aber es wird zum Beispiel von NHibernate verwendet. Um eine weise aufgegriffene Spalte als ORDER BY zu verwenden, ist der bevorzugte Weg).

um die Frage zu beantworten:

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

Neue Schlüsselwörter offset und fetch next (nur SQL-Standards folgend) wurden eingeführt.

Aber ich schätze, dass Sie SQL Server 2012 nicht verwenden, richtig? In der vorherigen Version ist es etwas (etwas) schwierig. Hier sind Vergleiche und Beispiele für alle SQL Server-Versionen: hier

Das könnte also in SQL Server 2008 funktionieren:

-- 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
220
Radim Köhler

Dazu müssen Sie die Abfrage nach einer Spalte in SQL Server anordnen, damit Sie die gewünschten Zeilen angeben können.

Beispiel:

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

Das Schlüsselwort "TOP" kann dabei nicht verwendet werden.

Hier können Sie mehr erfahren: https://technet.Microsoft.com/pt-br/library/gg699618%28v=sql.110%29.aspx

5
Felipe V. R.

SQL 2008

Die Antwort von Radim Köhler funktioniert, aber hier ist eine kürzere Version:

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

Quelle: https://forums.asp.net/post/4033909.aspx

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

verwenden Sie dies am Ende Ihrer ausgewählten Syntax. =)

Sie können eine verschachtelte Abfrage für die Paginierung wie folgt verwenden: Paging von 4 bis 8 Zeilen, wobei CustomerId der Primärschlüssel ist

SELECT Top 5 * FROM Kunden WHERE Land = "Deutschland" UND CustomerId Nicht in (SELECT Top 3 CustomerID FROM Kunden WHERE Land = "Deutschland" nach Stadt sortiert) Nach Stadt sortieren;

0
amoljdv06