Najczęstsze zapytania i podział na strony są powszechne w aplikacjach internetowych. Użytkownik wprowadza zestaw kryteriów, który uruchamia zapytanie, a następnie pozwala użytkownikowi klikać przyciski Poprzedni i Następny, aby przeglądać zestaw wyników. Aby osiągnąć tę funkcjonalność stronicowania, aplikacja musi mieć możliwość pobrania określonego zestawu wierszy z zapytania do bazy danych.
Rzućmy okiem na inną metodę w Oracle, aby uzyskać Top-N zapytań w Oracle i Pagination w zapytaniu Oracle
Przed 12c
(1) Korzystanie z klauzuli ROWNUM
Co to jest ROWNUM
Jest to pseudokolumna (a nie rzeczywista kolumna), która jest dostępna w zapytaniu. ROWNUM otrzyma liczby 1, 2, 3, 4, … N , gdzie N jest liczbą wierszy w zestawie ROWNUM jest używany. Wartość ROWNUM nie jest przypisana na stałe do wiersza.
Oto sposób na uzyskanie 5 najwyższych wartości
SELECT * FROM (SELECT * FROM dept ORDER BY sales DESC) WHERE ROWNUM <= 5;
Ta wersja posortuje dział według sprzedaży malejąco, a następnie zwróci pierwsze pięć napotkanych rekordów (pięć najwyższych rekordów).
W przypadku paginacji w Oracle , jeśli chcesz uzyskać 5 -10 rekordów w zamówieniu działu według opisu sprzedaży, to idź po to.
SELECT a.* FROM (SELECT ROWNUM rn, b.* FROM ( SELECT * FROM dept ORDER BY sales dsc) b where rn <=10) a WHERE a.rn >= 5
Ogólna składnia to
select * from ( select rownum rnum, a.* from (your_query) a where rownum <= M ) where rnum >= N;
(2) Używanie funkcji analitycznej ROW_NUMBER() Oracle:zachowuje się podobnie do pseudokolumny ROWNUM, ale jest bardziej elastyczny i ma więcej możliwości
Oto sposób na uzyskanie 5 najwyższych wartości
SELECT * FROM (SELECT d.*,row_number() over (ORDER BY d.sales DSC) rn FROM dept d ) WHERE rn <= 5;
Oto zapytanie dotyczące paginacji
SELECT * FROM ( SELECT d.*, row_number() over (ORDER BY d.sales DSC) rn FROM dept d) WHERE rn BETWEEN 0 AND 5 ORDER BY rn;
Powyższe Top N zapytań zwróci różne rekordy, gdy dwie rzeczy będą powiązane na miejscu podczas używania Top n zapytań
(3) Używanie RANK() i DENSE_RANK():Są to funkcje analityczne, których można użyć do usunięcia problemu opisanego powyżej
Oto sposób na uzyskanie 5 najwyższych wartości za pomocą rangi
SELECT * FROM (SELECT d.*,rank() over (ORDER BY d.sales DSC) rn FROM dept d ) WHERE rn <= 5;
Oto sposób, aby uzyskać 5 najwyższych wartości za pomocą gęstości_rank
SELECT * FROM (SELECT d.*,dense_rank() over (ORDER BY d.sales DSC) rn FROM dept d ) WHERE rn <= 5;
Z 12c
Funkcja Top-N :
Oracle Database 12c obsługuje klauzule FETCH FIRST/NEXT i OFFSET zgodne ze standardem ANSI — zwane łącznie klauzulą ograniczającą wiersze. Ta klauzula umożliwia łatwe pobranie pierwszych N rekordów z zestawu wyników lub, alternatywnie, pierwszych N rekordów po pominięciu zestawu rekordów, dzięki czemu można łatwo przeglądać zestaw wyników
Zapytanie Top-N pozwala nam pobrać górne lub dolne N wierszy z uporządkowanego zestawu. Połączenie dwóch zapytań Top-N daje możliwość przeglądania stron przez uporządkowany zestaw
Przykład:
SELECT value FROM mytable ORDER BY value DESC FETCH FIRST 10 ROWS ONLY; select * from my_test order by name fetch first 3 rows only;
Jeśli spojrzysz na plan optymalizatora dla powyższego zapytania, nadal używa on row_number() pod opakowaniem, aby to zrobić
Podział na strony może się również odbywać z tą funkcją przy użyciu składni offset
– przesuń 10 wierszy, pobierz tylko pierwsze 10 wierszy
select * from my_test order by id offset 10 rows fetch next 10 rows only;
– przesuń 10 wierszy, pobierz tylko pierwsze 0,1% wierszy
select * from my_test order by id offset 10 rows first 0.1 percent rows only;
– przesuń 10 rzędów, pobierz pierwsze 3 rzędy z wiązaniami. Oznacza to, że wszystkie górne wiersze z remisami również zostaną uwzględnione w wyniku
select * from my_test order by name fetch first 3 rows with ties;
Jeśli sprawdzisz plan optymalizatora powyższego zapytania, okaże się, że optymalizator używa funkcji rank(), jak pokazano powyżej w przypadku przed 12c
Ograniczenie
(1)Jeśli masz instrukcję SELECT z FOR UPDATE, nie możesz jej użyć.
(2)Instrukcja SELECT nie może CURRVAL ani NEXTVAL sekwencji
(3) Jeśli zapytanie widoków zmaterializowanych zawiera tę klauzulę, więc nie można wykonać przyrostowego odświeżania tego widoku zmaterializowanego
Mam nadzieję, że podoba Ci się artykuł na temat zapytań Top-N w Oracle i Paginacji w zapytaniu Oracle. Prosimy o przesłanie opinii
Też czyta
Funkcja Lead w Oracle
Funkcja RANK w Oracle
https://docs.oracle.com/javadb/10.8.3.0/ref/rrefsqljoffsetfetch.html