random row

SQL во всех проявлениях - от ANSI-92 до TSQL.

Модераторы: Yurich, Absurd

Ответить
michael
Сообщения: 116
Зарегистрирован: 15 июл 2004, 13:06
Откуда: ISRAEL (ранее - из Литвы)
Контактная информация:

В БД есть таблица с колонкой mykey которая является primary key и у неё проставленноо identity=true. Помогите написать как можно вернуть рендомальную row из этой таблицы
Аватара пользователя
AiK
Сообщения: 2287
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

Вообще лучше наверное будет не насиловать SQL и получить рандомное число в клиентском приложении. Дальше всё просто select * from my table where mykey = @rand

В MS SQL есть функция RAND. Даёт тебе рандомное число от 0 до 1. Умножаешь его на максимальное значение mykey.
Дальше получаешь целое число (FLOOR, ROUND, CAST, CONVERT по выбору). Ноль меняешь на единицу, т.к. identity на сколько я помню с единицы стартует.

В обоих случаях есть небольшая засада - если из таблицы удалялись строчки, то запрос может вернуть пустой резалтсет, т.к. непрерывность номеров нарушается. В этом случае следует перегенерить рандомное целое число и повторить запрос. Есс-но это опять удобнее сделать на клиенте, т.к. логику повторных запросов на SQL не очень удобно описывать. Хотя, можно немного смухлевать и выбирать ближайшую строчку сверху или с низу. (SET ROWCOUNT 1 и соотвтетственно условия выборки меняешь с равенства на нестрогое неравенство).
Даже самый дурацкий замысел можно воплотить мастерски
mm
Сообщения: 34
Зарегистрирован: 19 фев 2004, 10:36
Контактная информация:

Oracle:

SELECT * FROM
(SELECT * FROM my_table ORDER BY dbms_random.random)
WHERE rownum<2
Yurich
Сообщения: 107
Зарегистрирован: 23 фев 2004, 19:07

select * from my_table order by RAND() limit 1;
Ответить