Задача Требуется возвратить некоторое число записей таблицы, выбранных случайным образом. Необходимо так изменить следующее выражение, чтобы при каждом последующем выполнении оно возвращало разные пять строк:
select ename, job from emp;
Решение Возьмите любую встроенную функцию, возвращающую случайные значения, которую поддерживает ваша СУБД, и примените ее в операторе ORDER BY, чтобы сортировать строки в случайном порядке. Затем для нагладности ограничьте число возвращаемых строк. Oracle Используйте встроенную функцию VALUE, которая находится во встроенном пакете DBMS_RANDOM, в сочетании с ORDER BY и встроенную функцию ROWNUM:
select * from ( select ename, job from scott.emp order by dbms_random.value() ) where rownum <= 5;
Обсуждение Оператор ORDER BY может принимать возвращаемое функцией значение и использовать его для изменения порядка расположения элементов результирующего набора. Все предлагаемые решения ограничивают число возвращаемых строк после выполнения функции в операторе ORDER BY. Пользователям иных СУБД полезно рассмотреть решение Oracle, потому что на его примере можно (на концептуальном уровне) понять то, что в других решениях происходит "за кадром". Важно четко различать, что происходит при использовании в ORDER BY функции и числовой константы. При задании в операторе ORDER BY числовой константы сортировка осуществляется по столбцу с заданным в списке SELECT порядковым номером. Когда в ORDER BY задается функция, сортировке подвергается результат, возвращаемый функцией для каждой строки.
Источник: Молинаро Э. "SQL. Сборник рецептов"
|