Ψυχραιμία!
Ας τα πάρουμε τα πράγματα από την αρχή. Λοιπόν, αυτό που προσπαθείς να κάνεις δεν θα παίξει. Το αποτέλεσμα του ORDER BY rnd(x) θα είναι να βγάλει μια φορά έναν τυχαίο αριθμό και να τον θεωρήσει αυτόν ως τη στήλη, βάσει της οποίας θα κάνει το ORDER BY. Γι αυτόν το λόγο φαίνεται σαν να επιλέγονται τυχαίες εγγραφές πράγμα που δεν συμβαίνει στην πράξη. Το SELECT TOP 10 * FROM Table1 ORDER BY rnd(AQuestion) μπορεί να συνεπάγεται SELECT TOP 10 * FROM Table1 ORDER BY 1 ή SELECT TOP 10 * FROM Table1 ORDER BY 2 δηλαδή, ταξινόμηση κατά το πρώτο πεδίο ή το δεύτερο, κοκ. Αν στην πρώτη στήλη έχει ένα ID θα ταξινομήσει σε αύξουσα σειρά τους αριθμούς και θα πάρει τις 10 πρώτες εγγραφές. Αν στην δεύτερη έχει επίθετα, θα ταξινομήσει τα ονόματα και θα πάρει τις 10 πρώτες εγγραφές, αν στην τρίτη έχει ημερομηνίες, θα ταξινομήσει βάσει των ημερομηνιών και θα πάρει πάλι τις 10 πρώτες εγγραφές. Ωστόσο πάντοτε το SELECT TOP 10 * FROM Table1 ORDER BY 2 θα φέρνει τις ίδιες 10 πρώτες εγγραφές εκτός βέβαια αν στο μεταξύ κάνεις κάποιο insert/update/delete που αλλάζει τη σειρά.
Τώρα, μιας και είσαι άτυχος και δουλεύεις στην Access που αν δεν κάνω λάθος, δεν έχει guid function, μια απλή λύση είναι να κάνεις τα παρακάτω μέσα από τη VB:
- Με ένα query να πάρεις το πλήθος των εγγραφών του πίνακα, έστω Χ
- Να παράγεις όσους τυχαίους αριθμούς χρειάζεσαι από τιμή 1 ως Χ
- Με ένα DataReader να διαβάσεις σε loop τις εγγραφές και χρησιμοποιώντας έναν counter, όταν η τιμή του counter γίνεται ένας από τις τιμές που έβγαλες στο #2, να κρατάς την εγγραφή, αλλιώς να προχωράς στην επόμενη.
Υπάρχουν και άλλες τεχνικές που κινιούνται σε αυτήν τη φιλοσοφία, όπως πχ να κάνεις generate τυχαία κλειδιά (ειδικά αν το κλειδί είναι ένας ακέραιος αριθμός) και να τραβάς μία εγγραφή βάσει του τυχαίου κλειδιού. Όπως και να έχει απλά θα πρέπει να κρατάς τα τυχαία νούμερα που έχουν ήδη "βγει" σε κάποιο array και να ελέγχεις ότι ένα νέο τυχαίο νούμερο δεν βρίσκεται ήδη μέσα σε αυτό το array.
Vir prudens non contra ventum mingit