Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Najczęstsze zapytania i podział na strony w Oracle

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jaka jest różnica między funkcjami RANK() i DENSE_RANK() w Oracle?

  2. Używanie widoku bez klucza podstawowego z Entity

  3. Jak poprawnie korzystać z Oracle ORDER BY i ROWNUM?

  4. Jak wyeksportować dane pola clob w Oracle sql developer

  5. jak używać wpisów tns ze sterownikami macromedia dla Oracle