Problem:
Chcesz ograniczyć liczbę wierszy w zestawie wyników SQL Server.
Przykład:
Nasza baza danych zawiera tabelę o nazwie toy
z danymi w kolumnach id
, name
i price
.
id | imię | cena |
---|---|---|
161 | Rower BMX | 200,00 |
121 | Robot Tobie | 185,50 |
213 | Gra wędkarska | 25,00 |
102 | Zagadki ze zwierzętami | 45,80 |
111 | Zestaw toru wyścigowego | 126,70 |
233 | Łatwe klocki | 21.00 |
Wybierzmy nazwy i ceny zabawek. Ale musimy zobaczyć tylko pierwsze pięć rzędów.
Rozwiązanie 1:
SELECT name, price FROM toy ORDER BY price OFFSET 0 ROWS FETCH FIRST 5 ROWS ONLY;
Oto wynik zapytania:
nazwa | cena |
---|---|
Łatwe klocki | 21.00 |
Gra wędkarska | 25,00 |
Puzzle ze zwierzętami | 45,80 |
Zestaw toru wyścigowego | 126,70 |
Robot Tobie | 185,50 |
Dyskusja:
Aby ograniczyć liczbę wierszy w zestawie wyników, użyj ORDER BY z opcjonalnymi klauzulami OFFSET i FETCH. Najpierw zapytanie sortuje wiersze (ORDER BY). Następnie informujesz SQL Server, który powinien być pierwszym wierszem w zestawie wyników (OFFSET...ROWS) i ile wierszy ma zostać zwróconych (FETCH…ONLY).
Klauzula OFFSET jest umieszczana bezpośrednio po ORDER BY. Liczba całkowita wskazuje pierwszy wiersz do zliczenia (w SQL Server pierwszy wiersz to 0, drugi wiersz to 1 itd.), po którym następuje słowo kluczowe ROW lub ROWS. Możesz użyć ROWS lub ROWS, ale zaleca się używanie ROW dla 1 wiersza i ROWS dla 0 i wielu wierszy. Spójrz na zdjęcie:
W naszym przykładzie sortujemy według ceny (ORDER BY price
) i zacznij zwracać wyniki od pierwszego wiersza (OFFSET 0 ROWS
). Następnie używamy FETCH ze słowem kluczowym FIRST. Możesz użyć FIRST lub NEXT; zaleca się użycie FIRST, jeśli zaczynasz od pierwszego wiersza bez pominięcia żadnych rekordów, i NEXT, jeśli pominięto jakiekolwiek wiersze (tj. Jeśli PRZESUNIĘCIE jest większe niż 0).
Na koniec mamy liczbę wierszy do wybrania i słowo kluczowe ROWS ONLY. Użyj opcji ROWS ONLY, jeśli zwracasz wiele wierszy, a ROWS ONLY, gdy ograniczasz wynik do jednego wiersza. W naszym przykładzie ograniczamy to do pięciu wierszy (FETCH FIRST 5 ROWS ONLY
).
Poniżej mamy inne zapytanie, które ogranicza wiersze do pięciu, ale zaczyna się od piątego wiersza w tabeli (OFFSET 4 ROWS
):
Rozwiązanie 2:
SELECT name, price FROM toy ORDER BY price OFFSET 4 ROWS FETCH NEXT 5 ROWS ONLY;
Oto wynik zapytania:
nazwa | cena |
---|---|
Robot Tobie | 185,50 |
Rower BMX | 200,00 |
Zauważ, że to zapytanie zwraca tylko dwa wiersze, a nie pięć wskazanych. Spójrz na zdjęcie:
Dlaczego tylko dwa rzędy? Ponieważ ta tabela zawiera tylko sześć rekordów. Jeśli pominiemy pierwsze cztery rzędy i zaczniemy od piątego, pozostaną tylko dwa rzędy.
SQL Server ma inny sposób na ograniczenie liczby wierszy:klauzulę TOP.
Rozwiązanie 3:
SELECT TOP 3 name, price FROM toy ORDER BY price;
Oto wynik zapytania:
nazwa | cena |
---|---|
Łatwe klocki | 21.00 |
Gra wędkarska | 25,00 |
Puzzle ze zwierzętami | 45,80 |
Jeśli nie musisz pomijać żadnych wierszy, możesz użyć klauzuli TOP SQL Server, aby ograniczyć zwracane wiersze. Jest umieszczany bezpośrednio po SELECT. Po słowie kluczowym TOP następuje liczba całkowita wskazująca liczbę wierszy do zwrócenia. W naszym przykładzie zamówiliśmy według ceny a następnie ograniczył zwracane wiersze do 3.
W przeciwieństwie do metody OFFSET – FETCH, TOP nie wymaga ORDER BY. Oto podobny przykład, ale bez sortowania rekordów:
Rozwiązanie 4:
SELECT TOP 3 name, price FROM toy;
Oto wynik zapytania:
Zauważ, że zwrócono różne rekordy. Zwykle (ale nie zawsze) wiersze będą wyświetlane w kolejności, w jakiej rekordy zostały wstawione do tabeli.
Zalecamy używanie OFFSET i FETCH zamiast TOP, ponieważ OFFSET i FETCH są standardem SQL; TOP jest specyficzny dla T-SQL.