random row
Вообще лучше наверное будет не насиловать SQL и получить рандомное число в клиентском приложении. Дальше всё просто select * from my table where mykey = @rand
В MS SQL есть функция RAND. Даёт тебе рандомное число от 0 до 1. Умножаешь его на максимальное значение mykey.
Дальше получаешь целое число (FLOOR, ROUND, CAST, CONVERT по выбору). Ноль меняешь на единицу, т.к. identity на сколько я помню с единицы стартует.
В обоих случаях есть небольшая засада - если из таблицы удалялись строчки, то запрос может вернуть пустой резалтсет, т.к. непрерывность номеров нарушается. В этом случае следует перегенерить рандомное целое число и повторить запрос. Есс-но это опять удобнее сделать на клиенте, т.к. логику повторных запросов на SQL не очень удобно описывать. Хотя, можно немного смухлевать и выбирать ближайшую строчку сверху или с низу. (SET ROWCOUNT 1 и соотвтетственно условия выборки меняешь с равенства на нестрогое неравенство).
В MS SQL есть функция RAND. Даёт тебе рандомное число от 0 до 1. Умножаешь его на максимальное значение mykey.
Дальше получаешь целое число (FLOOR, ROUND, CAST, CONVERT по выбору). Ноль меняешь на единицу, т.к. identity на сколько я помню с единицы стартует.
В обоих случаях есть небольшая засада - если из таблицы удалялись строчки, то запрос может вернуть пустой резалтсет, т.к. непрерывность номеров нарушается. В этом случае следует перегенерить рандомное целое число и повторить запрос. Есс-но это опять удобнее сделать на клиенте, т.к. логику повторных запросов на SQL не очень удобно описывать. Хотя, можно немного смухлевать и выбирать ближайшую строчку сверху или с низу. (SET ROWCOUNT 1 и соотвтетственно условия выборки меняешь с равенства на нестрогое неравенство).
Даже самый дурацкий замысел можно воплотить мастерски
Oracle:
SELECT * FROM
(SELECT * FROM my_table ORDER BY dbms_random.random)
WHERE rownum<2
SELECT * FROM
(SELECT * FROM my_table ORDER BY dbms_random.random)
WHERE rownum<2
select * from my_table order by RAND() limit 1;