Περισσότερα
Πώς μπορώ να περιορίσω τον αριθμό των σειρών που επιστρέφονται από ένα ερώτημα Oracle μετά την ταξινόμηση;
Υπάρχει τρόπος να κάνετε ένα ερώτημα Oracle
να συμπεριφέρεται σαν να περιέχει μια ρήτρα MySQL limit
;
Στην MySQL
, μπορώ να το κάνω αυτό:
select *
from sometable
order by name
limit 20,10
για να πάρω την 21η έως την 30η γραμμή (παραλείπω τις πρώτες 20, δίνω τις επόμενες 10). Οι σειρές επιλέγονται μετά την order by
, οπότε ξεκινάει πραγματικά από το 20ο όνομα αλφαβητικά.
Στο Oracle
, το μόνο πράγμα που αναφέρουν οι άνθρωποι είναι η ψευδοστήλη rownum
, αλλά αξιολογείται πριν από την order by
, πράγμα που σημαίνει το εξής:
select *
from sometable
where rownum <= 10
order by name
θα επιστρέψει ένα τυχαίο σύνολο δέκα σειρών ταξινομημένων με βάση το όνομα, κάτι που συνήθως δεν είναι αυτό που θέλω. Επίσης, δεν επιτρέπει τον προσδιορισμό μιας μετατόπισης.
963
3
Μπορείτε να χρησιμοποιήσετε ένα υποερώτημα για αυτό, όπως
Μια αναλυτική λύση με ένα μόνο ένθετο ερώτημα:
Η
Rank()
θα μπορούσε να αντικαταστήσει τηνRow_Number()
αλλά μπορεί να επιστρέψει περισσότερες εγγραφές από όσες περιμένετε αν υπάρχουν διπλές τιμές για το όνομα.(μη δοκιμασμένο) κάτι σαν αυτό μπορεί να κάνει τη δουλειά
Υπάρχει επίσης η αναλυτική συνάρτηση rank, την οποία μπορείτε να χρησιμοποιήσετε για να διατάξετε κατά.