web-dev-qa-db-fra.com

Comment obtenir des enregistrements de manière aléatoire à partir de la base de données Oracle?

Je dois sélectionner des lignes au hasard dans une base de données Oracle.

Ex: supposons une table avec 100 lignes, comment je peux retourner au hasard 20 de ces enregistrements sur 100 lignes.

64
Bhadra
    SELECT *
    FROM   table
    ORDER BY DBMS_RANDOM.VALUE FETCH NEXT 20 ROWS ONLY;
95
cagcowboy

SAMPLE () n'est pas garanti de vous donner exactement 20 lignes, mais pourrait convenir requête complète + tri par ordre aléatoire pour les grandes tables):

SELECT *
FROM   table SAMPLE(20);

Noter la 20 Voici un pourcentage approximatif, pas le nombre de lignes souhaité. Dans ce cas, puisque vous avez 100 lignes, pour obtenir environ 20 lignes, vous demandez un échantillon de 20%.

40
Jeffrey Kemp
SELECT * FROM table SAMPLE(10) WHERE ROWNUM <= 20;

Ceci est plus efficace car il n’a pas besoin de trier la table.

12
grokster
SELECT column FROM
( SELECT column, dbms_random.value FROM table ORDER BY 2 )
where rownum <= 20;
9
Bishan

Pour sélectionner au hasard 20 rangées, je pense que vous feriez mieux de choisir le lot ordonné au hasard et de sélectionner les 20 premières de cet ensemble.

Quelque chose comme:

Select *
  from (select *
          from table
         order by dbms_random.value) -- you can also use DBMS_RANDOM.RANDOM
 where rownum < 21;

Il est préférable d’utiliser les petites tables pour éviter de sélectionner de gros morceaux de données, mais pour en éliminer la majeure partie.

4
Nishant Sharma