metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2010-09-03 08:39 am

Поведение запроса

Народ, а гляньте в разных СУБД, что покажет такой запрос?
select rand() as a from some_table order by a

Т.е. рандом выбранный из таблицы с несколькими полями и сортировкой по этому же полю. В Firebird, судя по результатам, оно два раза считает рандом - один раз для показа, второй для сортировки.

PS: Firebird не сортирует даже такое:
select * from (select rand() as a from some_table) order by a
Ленивые вычисления без мемоизации и проверки на побочные эффекты у них там что ле.

[identity profile] metaclass.livejournal.com 2010-09-03 09:06 am (UTC)(link)
"Суровый микрософтовский рандом" :)

[identity profile] 184467440737095.livejournal.com 2010-09-03 09:36 am (UTC)(link)
http://xkcd.com/221/

[identity profile] kisa-i-osya.livejournal.com 2010-09-03 03:47 pm (UTC)(link)
Да, у MS крайне весело в этом плане сделано, смешнее там только выборка по смещению (хотя может в 2008 что допилили).

[identity profile] ennor.livejournal.com 2010-09-03 04:49 pm (UTC)(link)
У микрософта документировано, что Rand() вызывается в запросе столько раз, сколько она упомянута в его тексте, поэтому как-либо рандомизировать с ее помощью бесполезно.

Если нужна рандомная сортировка, то как вариант можно использовать newid() - он вызывается по разу на строку. Соответственно, если надо вывести столбец сколько-нибудь читабельного типа, то checksum(newid()), хотя некоторые пуристы морщат от этого носик.