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