Мне нужно выбрать строки случайным образом из базы данных Oracle.
Пример: Предположим, что таблица из 100 строк, как я могу случайным образом вернуть 20 из этих записей из всех 100 строк.
Мне нужно выбрать строки случайным образом из базы данных Oracle.
Пример: Предположим, что таблица из 100 строк, как я могу случайным образом вернуть 20 из этих записей из всех 100 строк.
SELECT *
FROM table
ORDER BY DBMS_RANDOM.VALUE FETCH NEXT 20 ROWS ONLY;
SAMPLE() не гарантирует вам ровно 20 строк, но может быть подходящим (и может выполнять значительно лучше, чем полный запрос + sort-by-random для больших таблиц):
SELECT *
FROM table SAMPLE(20);
Примечание: 20
здесь приблизительный процент, а не количество требуемых строк. В этом случае, поскольку у вас есть 100 строк, чтобы получить приблизительно 20 строк, вы запрашиваете 20% -ный образец.
SELECT * FROM table SAMPLE(10) WHERE ROWNUM <= 20;
Это более эффективно, так как не нужно сортировать таблицу.
SELECT column FROM
( SELECT column, dbms_random.value FROM table ORDER BY 2 )
where rownum <= 20;
Чтобы случайным образом выбрать 20 строк, я думаю, вам лучше выбрать, сколько из них упорядочено и выбрать первые 20 из этого набора.
Что-то вроде:
Select *
from (select *
from table
order by dbms_random.value) -- you can also use DBMS_RANDOM.RANDOM
where rownum < 21;
Лучше всего использовать для небольших таблиц, чтобы избежать выбора больших фрагментов данных, только чтобы отбросить большинство из них.
В итоге были представлены два способа
1) using order by DBMS_RANDOM.VALUE clause
2) using sample([%]) function
Первый способ имеет преимущество в "ПРАВИЛЬНОСТИ", что означает, что вы никогда не потерпите неудачу, получите результат, если он действительно существует, в то время как во втором случае вы можете не получить результат, даже если в нем есть случаи, удовлетворяющие условию запроса, поскольку информация уменьшается во время выборки..
Второй способ имеет преимущество в "EFFICIENT", что означает, что вы получите результат быстрее и обеспечите небольшую нагрузку на вашу базу данных. Мне было дано предупреждение от администратора базы данных, что мой запрос с использованием первого способа загружает базу данных
Вы можете выбрать один из двух способов в соответствии с вашими интересами!
Таблица
SELECT * FROM
(
SELECT column_name FROM table_name
ORDER BY dbms_random.value
)
WHERE rownum = 1;