2011-09-20 5 views
29

Chcę sortować według właściwości WSZYSTKIE dane w mojej db i TYLKO PO TYM, że używam LIMIT i OFFSET.SQL (ORACLE): ORDER BY i LIMIT

Query tak:

SELECT select_list 
    FROM table_expression 
    [ ORDER BY ... ] 
    [ LIMIT { number | ALL } ] [ OFFSET number ] 

wiem sortowania kończy się tak szybko, jak to stwierdził pierwsze wiersze ROW_COUNT z posortowanej wyniku. Czy mogę posortować wszystkie dane przed wywołaniem LIMIT i OFFSET?

+0

Powiązane: http://stackoverflow.com/q/470542/1461424 – Krumia

Odpowiedz

54

Przed rokiem 12.1 firma Oracle nie obsługuje słów kluczowych LIMIT ani OFFSET. Jeśli chcesz, aby pobrać wiersze N ​​przez M zbioru wynikowego, że trzeba coś takiego:

SELECT a.* 
    FROM (SELECT b.*, 
       rownum b_rownum 
      FROM (SELECT c.* 
        FROM some_table c 
       ORDER BY some_column) b 
     WHERE rownum <= <<upper limit>>) a 
WHERE b_rownum >= <<lower limit>> 

lub z wykorzystaniem funkcji analitycznych:

SELECT a.* 
    FROM (SELECT b.*, 
       rank() over (order by some_column) rnk 
      FROM some_table) 
WHERE rnk BETWEEN <<lower limit>> AND <<upper limit>> 
ORDER BY some_column 

Każda z tych metod będzie sort daje wiersze N przez M posortowanego wyniku.

12.1 i później, można użyć OFFSET i/lub FETCH [FIRST | NEXT] operatorzy:

SELECT * 
    FROM some_table 
ORDER BY some_column 
OFFSET <<lower limit>> ROWS 
    FETCH NEXT <<page size>> ROWS ONLY 
+2

Być może nie tak łatwo odpowiedzieć, jak to jest pytanie: Które z tych podejść jest prawdopodobnie lepsze w przypadku bardzo dużych tabel (1-10 milionów wierszy)? Może chodzi o 3-deep selekcji vs 2-deep z rangą()? Właściwie to chyba spróbuję obu i zobaczę. –

+7

Dla każdego, kto się zastanawia, odkryłem, że pierwsze podejście było dla mnie szybsze po kilku ms, z drugim podejściem po kilku sekundach. Nie jestem pewien, czy to sama funkcja dodaje czasu, czy też zapobiega optymalizacji zapytań. Dzięki za pokazanie wielu podejść i tak! –