W PostgreSQL są słowa kluczowe Limit
i, Offset
które pozwolą na bardzo łatwe paginowanie zbiorów wynikowych.
Jaka jest równoważna składnia dla programu SQL Server?
sql
sql-server
pagination
limit
offset
Earlz
źródło
źródło
Odpowiedzi:
Odpowiednik
LIMIT
isSET ROWCOUNT
, ale jeśli chcesz mieć ogólną paginację, lepiej napisać takie zapytanie:Zaletą jest tutaj parametryzacja przesunięcia i limitu w przypadku, gdy zdecydujesz się zmienić opcje stronicowania (lub zezwolisz na to użytkownikowi).
Uwaga:
@Offset
parametr powinien używać jednej opartej indeksowanie za to zamiast normalnego indeksowania opartego na zero.źródło
WHERE RowNum >= (@Offset + 1)
The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP or FOR XML is also specified
. MSSQL2008 R2.Table
ma 200k rekordów, najpierw pobierze wszystkie, a potem zastosuje limit? Czy to zapytanie jest wydajne?Ta funkcja jest teraz uproszczona w programie SQL Server 2012. Działa od wersji SQL Server 2012.
Ogranicz z przesunięciem, aby wybrać od 11 do 20 wierszy w programie SQL Server:
OFFSET
: liczba pominiętych wierszyNEXT
: wymagana liczba następnych rzędówŹródła: https://docs.microsoft.com/en-us/sql/t-sql/queries/select-order-by-clause-transact-sql?view=sql-server-2017
źródło
SQL_CALC_FOUND_ROWS
gdy używasz tego?Uwaga: to rozwiązanie będzie działać tylko w SQL Server 2005 lub nowszym, ponieważ wtedy
ROW_NUMBER()
zostało wdrożone.źródło
AS xx
Aby to osiągnąć, możesz użyć ROW_NUMBER we wspólnym wyrażeniu tabelowym.
źródło
Dla mnie użycie OFFSET i FETCH razem było powolne, więc użyłem kombinacji TOP i OFFSET w ten sposób (który był szybszy):
Uwaga: jeśli używasz jednocześnie TOP i OFFSET w tym samym zapytaniu, na przykład:
Następnie pojawia się błąd, więc aby użyć GÓRA i PRZESUNIĘCIE razem, musisz je oddzielić zapytaniem podrzędnym.
A jeśli potrzebujesz użyć polecenia SELECT DISTINCT, zapytanie wygląda następująco:
Uwaga: użycie SELECT ROW_NUMBER z DISTINCT nie działa dla mnie.
źródło
SELECT TOP 20 id FROM table1 where id > 10 order by date OFFSET 20 rows
, musisz go przekształcić w ten sposóbSELECT TOP 20 * FROM (SELECT id FROM table1 where id > 10 order by date OFFSET 20 ROWS) t1
. Zmienię odpowiedź. Dziękuję i wybacz mi mój angielski.Kolejna próbka:
źródło
Jest tutaj ktoś, kto mówi o tej funkcji w sql 2011, to smutne, że wybrali trochę inne słowo kluczowe "OFFSET / FETCH", ale nie jest to standard, wtedy ok.
źródło
Dodając niewielką różnicę w rozwiązaniu Aaronaught, zwykle parametryzuję numer strony (@PageNum) i rozmiar strony (@PageSize). W ten sposób każde zdarzenie kliknięcia strony wysyła po prostu żądany numer strony wraz z konfigurowalnym rozmiarem strony:
źródło
Najbliżej mogłem zrobić
Który chyba podobny
select * from [db].[dbo].[table] LIMIT 0, 10
źródło
źródło
źródło
Ponieważ nikt jeszcze nie podał tego kodu:
Ważne punkty:
@limit
można zastąpić liczbą wyników do pobrania,@offset
to liczba wyników do pominięciawhere
iorder by
klauzulami i zapewni nieprawidłowe wyniki, jeśli nie są zsynchronizowaneorder by
jest wyraźnie, jeśli jest to potrzebneźródło
źródło
Specyficznie dla SQL-SERVER można to osiągnąć na wiele różnych sposobów, dla przykładu wzięliśmy tutaj tabelę Customer.
Przykład 1: z „USTAW ROWCOUNT”
Aby zwrócić wszystkie wiersze, ustaw ROWCOUNT na 0
Przykład 2: z „ROW_NUMBER i OVER”
Przykład 3: Z „OFFSET and FETCH”, ale z tym „ORDER BY” jest obowiązkowe
Mam nadzieję, że to ci pomoże.
źródło
Na serwerze SQL użyłbyś TOP razem z ROW_NUMBER ()
źródło
Ponieważ testuję więcej razy, ten skrypt jest bardziej przydatny o 1 milion rekordów na każdej stronie. 100 rekordów z paginacją działa szybciej mój komputer wykonuje ten skrypt 0 sekund, podczas gdy w porównaniu z mysql ma własny limit i przesunięcie około 4,5 sekundy, aby uzyskać wynik.
Ktoś może nie zrozumieć, że Row_Number () zawsze sortuje według określonego pola. W przypadku, gdy musimy zdefiniować tylko wiersz w sekwencji, należy użyć:
ROW_NUMBER () OVER (ORDER BY (SELECT NULL))
Wyjaśnić:
źródło