Próbuję zrobić coś takiego:
SELECT * FROM table LIMIT 10,20
lub
SELECT * FROM table LIMIT 10 OFFSET 10
ale używając SQL Server
Jedyne rozwiązanie, które znalazłem, wygląda na przesadę:
SELECT * FROM (
SELECT *, ROW_NUMBER() OVER (ORDER BY name) as row FROM sys.databases
) a WHERE row > 5 and row <= 10
Ja również znaleźć :
SELECT TOP 10 * FROM stuff;
... ale to nie jest to, co chcę robić, ponieważ nie mogę określić limitu początkowego.
Czy mogę to zrobić w inny sposób?
Ciekawe, czy istnieje powód, dla którego SQL Server nie obsługuje tej LIMIT
funkcji lub czegoś podobnego? Nie chcę być podły, ale to naprawdę brzmi jak coś, czego potrzebuje DBMS ... Jeśli tak, to przepraszam za taką ignorancję! Pracuję z MySQL i SQL + od 5 lat, więc ...
sql
sql-server
pagination
limit
marcgg
źródło
źródło
ROW_NUMBER()
i ograniczanieTOP
szerokości zakresu iWHERE
warunku ograniczenia zakresu jest najlepsze, jakie udało mi się osiągnąć. Zauważyłem również znacznie lepszą wydajność, jeśliTOP
klauzula używa literału zamiast zmiennejOdpowiedzi:
LIMIT
Klauzula nie jest częścią standardowego SQL. Jest obsługiwany jako rozszerzenie dostawcy do SQL przez MySQL, PostgreSQL i SQLite.Bazy danych innych marek mogą mieć podobne funkcje (np.
TOP
W Microsoft SQL Server), ale nie zawsze działają one identycznie.Trudno jest
TOP
naśladowaćLIMIT
klauzulę w programie Microsoft SQL Server . Są przypadki, w których to po prostu nie działa.Rozwiązanie, które pokazałeś,
ROW_NUMBER()
jest dostępne w Microsoft SQL Server 2005 i nowszych. To najlepsze rozwiązanie (na razie), które działa wyłącznie jako część zapytania.Innym rozwiązaniem jest użycie
TOP
do pobrania pierwszy licznik + przesunięć wierszy, a następnie użyj funkcji API szukać po pierwszym przesuniętych rzędach.Zobacz też:
źródło
W przypadku programu SQL Server 2012 + możesz użyć .
źródło
offset
, czy możesz zostawić tę linię (zakładając, że nie chcesz przesunięcia)?OFFSET 0 ROWS
Parse error at line: 4, column: 1: Incorrect syntax near 'OFFSET'
jak znalazłeś, jest to preferowana metoda serwera sql:
źródło
a
po wewnętrznym wyborze? Zakładam, że dajesz wewnętrznemu aliasowi select, ale wtedy wydaje się, że nigdy go nie używasz ... Czy powinieneś to zrobića.row
zamiast tylkorow
?( )
tabeli pochodnej, ale pozwoli to odejść, jeśli zapomnisz użyć go do odniesienia się do kolumn. Naprawiłem to jednak ...Jeśli używasz SQL Server 2012+, zagłosuj na odpowiedź Martina Smitha i użyj rozszerzeń
OFFSET
iFETCH NEXT
doORDER BY
,Jeśli masz pecha i utknąłeś z wcześniejszą wersją, możesz zrobić coś takiego,
Uważam, że jest funkcjonalnym odpowiednikiem
i najlepszy sposób, jaki znam, robiąc to w TSQL, przed MS SQL 2012.
Jeśli istnieje bardzo wiele wierszy, lepszą wydajność można uzyskać, używając tabeli tymczasowej zamiast CTE.
źródło
Niestety,
ROW_NUMBER()
to najlepsze, co możesz zrobić. Właściwie jest to bardziej poprawne, ponieważ wyniki alimit
lubtop
klauzuli tak naprawdę nie mają znaczenia bez poszanowania określonej kolejności. Ale nadal jest to trudne.Aktualizacja: Sql Server 2012 dodaje funkcję
limit
podobną do funkcji poprzez słowa kluczowe OFFSET i FETCH . Jest to podejście ansi-standardowe, w przeciwieństwie doLIMIT
niestandardowego rozszerzenia MySql.źródło
Co powiesz na to?
Daje ci ostatnie 10 rzędów z pierwszych 20 rzędów. Wadą jest to, że kolejność jest odwrotna, ale przynajmniej jest łatwa do zapamiętania.
źródło
Powinien dać rekordy 11-20. Prawdopodobnie niezbyt wydajne przy zwiększaniu, aby uzyskać kolejne strony, i nie wiem, jak może na to wpłynąć zamawianie. Może trzeba będzie to określić w obu instrukcjach WHERE.
źródło
Dobrym sposobem jest stworzenie procedury:
tak jak limit 0,2 /////////////// Wykonaj paginację 0,4
źródło
Tylko dla rozwiązania rekordowego, które działa w większości silników baz danych, choć może nie być najbardziej wydajne:
Uwaga: ostatnia strona nadal zawierałaby wiersze ReturnCount bez względu na to, czym jest SkipCount. Ale w wielu przypadkach może to być dobra rzecz.
źródło
Odpowiednikiem LIMIT jest SET ROWCOUNT, ale jeśli chcesz mieć ogólną paginację, lepiej napisać takie zapytanie:
źródło
Drukuje wiersze od 10 do 15.
źródło
Jak dotąd ten format działa dla mnie (chociaż nie jest to najlepsza wydajność):
Uwaga z boku, paginowanie danych dynamicznych może prowadzić do dziwnych / nieoczekiwanych wyników.
źródło
Z dokumentacji online MS SQL Server ( http://technet.microsoft.com/en-us/library/ms186734.aspx ), oto ich przykład, który przetestowałem i działa, w celu pobrania określonego zestawu wierszy. ROW_NUMBER wymaga OVER, ale możesz zamówić, co chcesz:
źródło
Użyj całego serwera SQL:; z tbl as (SELECT ROW_NUMBER () over (order by (select 1)) as RowIndex, * from table) wybierz top 10 * z tabeli, gdzie RowIndex> = 10
źródło
wydrukuje od 15 do 25 jako podobny limit w MYSQl
źródło