7 сентября 2014 г.

Выбрать случайную запись из таблицы

Выбрать случайную запись из таблицы

Назначение

При подготовке к объёмному тестированию нужно наполнить базу данных связанными тестовыми данными. Если в тестируемой системе нет сложных прав доступа и фильтраторов, то для ускорения процесса заполнения базы данных данными можно использовать SQL-запросы. Нагенерировать связанных данных, работая с базой напрямую. При этом нужно выбирать случайные записи из связанных таблиц.

Теория

Для выборки случайной записи используется сортировка по случайному значению.
Из отсортированной выборки выбирается первая запись.

Для получения случайного значения подойдут функции:
  • RAND();
  • NEWID().

Выбор первой записи задаётся инструкцией TOP(1).

Примеры

Пример результирующего SQL-запроса:
SELECT TOP(1) "ID", "Text"
FROM "DataTable"
ORDER BY NEWID()

Боле быстрый код:
SELECT TOP(1) "ID", "Text"
FROM "DataTable"
ORDER BY RAND()

Если нужно наложить фильтр на данные из таблицы, используется инструкция WHERE.
SELECT TOP(1) "ID", "Text"
FROM "DataTable"
WHERE "ID" >= 100 AND "ID" <= 1000
ORDER BY RAND()

Примечание

Если надо будет SQL-запросами создать миллионы связанных записей. То от идеи случайной выборки лучше отказаться.
Сценарий заполнения базы данных зависнет. В случае огромного количества записей, надо использовать вычисления. Это возможно, если в качестве идентификаторов используются последовательные целые числа.

Например, в таблице "Links" в поле "FolderID" нужно вставить случайное значение из поля "ID" таблицы "Folders", где "ID" - целочисленный счётчик.
Заранее создаётся необходимое тестовое количество записей в "Folders" с подряд идущими значениями 5678...105678.
И при вставке не сканируем таблицу "Folders", а сразу вычисляем случайное значение "ID" из интервала 5678...105678, с помощью RAND() и ROUND().

SELECT @ID = @НачалоИнтервала + ROUND(RAND() * (@КонецИнтервала - @НачалоИнтервала), 0)

Пример с интервалом 5678...105678:
SELECT @ID = 5678 + ROUND(RAND() * (105678 - 5678), 0)

Комментариев нет:

Отправить комментарий