web-dev-qa-db-fra.com

SQL (Oracle): ORDER BY et LIMIT

Je veux trier par propriété TOUTES les données de ma base de données et UNIQUEMENT APRÈS avoir utilisé LIMIT et OFFSET.

Requête comme ceci:

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

Je sais que le tri se termine dès qu'il a trouvé les premières lignes row_count du résultat trié. Puis-je trier toutes les données avant d'appeler LIMIT et OFFSET?

30
DraggonZ

Avant la version 12.1, Oracle ne prend pas en charge les mots clés LIMIT ou OFFSET. Si vous souhaitez récupérer les lignes N à M d'un jeu de résultats, vous aurez besoin de quelque chose comme:

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>>

ou en utilisant des fonctions analytiques:

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

L'une ou l'autre de ces approches triera vous donnera les lignes N à M du résultat trié.

Dans 12.1 et versions ultérieures, vous pouvez utiliser les OFFSET et/ou FETCH [FIRST | NEXT] les opérateurs:

SELECT *
  FROM some_table
 ORDER BY some_column
 OFFSET <<lower limit>> ROWS
  FETCH NEXT <<page size>> ROWS ONLY
54
Justin Cave