![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
"случайная" сортировка [D5, IB6.x]
Andrey V. © (2004-12-10 09:10:00)Полскажите как можно случайно замешать результат sql-запроса, каждый запуск запроса должен давать разную сортировку.
Или без промежуточной таблицы не обойтись ?
Ильичев С.А. (2004-12-10 23:14:00) [1]У меня была такая задача. Решил следующим образом:
Во-первых нужен генератор случайных чисел коего нет в ib.
Пишем библиотеку с одной функцией.
library TestSystem_udf;
uses System;
function RANDOM_AT(var Range: Integer): Integer; cdecl;
begin
Randomize;
Result:=Random(Range);
end;
exports RANDOM_AT;
end.
Кладём её куда следует.
Далее объявляем в базе нашу udf.
declare external function RANDOM
integer
returns integer by value
entry_point 'RANDOM_AT'
module_name 'TestSystem_udf.dll';
Затем добавляем к нужной таблице столбец
(назовём его RandomValue)
Нуивот.
Каждый раз перед нашим главным запросом(1) выполняем
подготовительный, вида:
UPDATE TableName SET RandomValue=RANDOM(100)
Это поле заполняется случанными значениями.
Всё.
В запросе(1) заказываем сортировку по полю RandomValue;
Замечу, что каждый раз заполнять случайными значениями
всю таблицу не рационально. Обновлять надо только те записи
которые могут попать в результат запроса(1).
А значит в подготовительном запросе надо указать условие
точно такое же как и в запросе(1).
И, кстати, да. Пора эту тему в FAQ занести.
Val (2004-12-10 18:06:00) [2]> [6] Andrey V. © (10.12.04 14:22)
нет, конкатенируйте. только это будет сортировка по случайному столбцу - вам это надо?
Andrey V. (2004-12-10 14:22:00) [3]
> select *
> from your_table
> order by :order_param
А параметр вообще можно ставить в order by
Что-то у меня и программа ругается и IBExpert не принимает подоьную конструкцию...
Виталий Панасенко (2004-12-10 10:30:00) [4]А не проще ли (если делаем в программе а не в ISQL) по набору мотаться
Qry.First;
Qry.MoveBy(Random(Qry.RecordCount (или зарание подсчитанное значение)+1) ?
Ditrix (2004-12-10 10:19:00) [5]Andrey V. © (10.12.04 09:46) [3]
зачем ?
просто перед вызовом пишешь
Query.ParamByName('order_param').AsString = YourRandomFieldName;
потом
Query.Open
или о Delphi речь вообще не идет?
Andrey V. (2004-12-10 09:46:00) [6]то есть если я делаю выборку
select *
from table1
where Условие
сначала сделать
Update table1 set Rnd=:GenerateRandom
where Условие
?
ИМХО накладно по скорости может оказаться ...
DenK_vrtz (2004-12-10 09:19:00) [7]Данный вопрос становится популярным!
Было неделю(если память не изменяет) назад.
Было предложено такое решение. Выделить под сортировку поле, которое необходимо заполнять случайными числами. Поэтому полю и производить сортировку.
Ditrix (2004-12-10 09:16:00) [8]select *
from your_table
order by :order_param