Возвращение n случайных записей таблицы
Задача
Требуется возвратить некоторое число записей таблицы, выбранных случайным образом. Необходимо так изменить следующее выражение, чтобы при каждом последующем выполнении оно возвращало разные пять строк:
select e.ename, e.job
from emp e
Решение
Используйте встроенную функцию VALUE, которая находится во встроенном пакете DBMS_RANDOM, в сочетании с ORDER BY и встроенную функцию ROWNUM:
select x.*
from (
select e.ename, e.job
from emp e
order by dbms_random.value()
) x
where rownum <=5
ENAME JOB
---------- ----------
MILLER CLERK
SMITH CLERK
KING PRESIDENT
JONES MANAGER
TURNER SALESMAN
ENAME JOB
---------- ----------
KING PRESIDENT
ALLEN SALESMAN
JAMES CLERK
SCOTT ANALYST
FORD ANALYST
Обсуждение
Происходит сортировка результирующего набора с помощью оператоара ORDER BY и функции dbms_random.value(). После этого происходит ограничение числа возвращаемых строк с помощью функции ROWNUM.
Важно четко различать, что происходит при использовании в ORDER BY функции и числовой константы. При задании в операторе ORDER BY числовой константы, сортировка осуществляется по столбцу с заданным в списке SELECT порядковым номером. Когда в ORDER BY задается функция, сортировке подвергается результат, возвращаемый функцией для каждой строки.