Я отвечу на это вопрос с использованием Vertica в качестве базы данных.
Vertica имеет функцию RANDOM()
, которая возвращает случайное число двойной точности между 0 и 1 и функцию RANDOMINT(<*integer*>)
, которая возвращает целое число от 0 до *<integer>*-1
. Я буду использовать RANDOMINT(5)
для этого примера.
Как общее предложение - Изолируйте свою конкретную проблему в своем вопросе. Соединения в вашем запросе не являются частью проблемы. И используйте примерную таблицу, как в приведенном ниже коде.
Как указывалось в некоторых предыдущих ответах, RANDOMINT(5)
вернет новое случайное целое число от 0 до 4 для каждой строки, считанной из таблицы exam
.
Смотрите здесь:
WITH exam(id,exam,exam_res) AS (
SELECT 1,1,'exam_res_1'
UNION ALL SELECT 2,2,'exam_res_2'
UNION ALL SELECT 3,3,'exam_res_3'
UNION ALL SELECT 4,4,'exam_res_4'
UNION ALL SELECT 5,5,'exam_res_5'
UNION ALL SELECT 6,1,'exam_res_1'
UNION ALL SELECT 7,2,'exam_res_2'
UNION ALL SELECT 8,3,'exam_res_3'
UNION ALL SELECT 9,4,'exam_res_4'
UNION ALL SELECT 10,5,'exam_res_5'
UNION ALL SELECT 11,1,'exam_res_1'
UNION ALL SELECT 12,2,'exam_res_2'
UNION ALL SELECT 13,3,'exam_res_3'
UNION ALL SELECT 14,4,'exam_res_4'
UNION ALL SELECT 15,5,'exam_res_5'
)
SELECT * FROM exam WHERE exam=RANDOMINT(5)+1
;
id|exam|exam_res
3| 3|exam_res_3
4| 4|exam_res_4
5| 5|exam_res_5
6| 1|exam_res_1
7| 2|exam_res_2
9| 4|exam_res_4
12| 2|exam_res_2
Что вам нужно сделать, это убедиться, что вы называете генератор случайных чисел только один раз.
Если ваша база данных соответствует стандарту ANSI 99 и поддерживает предложение WITH (общее выражение таблицы, так как я также использую его для генерации данных образца), сделайте это также в общем табличном выражении, которое я называю search_exam
:
WITH search_exam(exam) AS (
SELECT RANDOMINT(5)+1
)
, exam(id,exam,exam_res) AS (
SELECT 1,1,'exam_res_1'
UNION ALL SELECT 2,2,'exam_res_2'
UNION ALL SELECT 3,3,'exam_res_3'
UNION ALL SELECT 4,4,'exam_res_4'
UNION ALL SELECT 5,5,'exam_res_5'
UNION ALL SELECT 6,1,'exam_res_1'
UNION ALL SELECT 7,2,'exam_res_2'
UNION ALL SELECT 8,3,'exam_res_3'
UNION ALL SELECT 9,4,'exam_res_4'
UNION ALL SELECT 10,5,'exam_res_5'
UNION ALL SELECT 11,1,'exam_res_1'
UNION ALL SELECT 12,2,'exam_res_2'
UNION ALL SELECT 13,3,'exam_res_3'
UNION ALL SELECT 14,4,'exam_res_4'
UNION ALL SELECT 15,5,'exam_res_5'
)
SELECT id,exam,exam_res FROM exam
WHERE exam=(SELECT exam FROM search_exam)
;
id|exam|exam_res
1| 1|exam_res_1
6| 1|exam_res_1
11| 1|exam_res_1
В качестве альтернативы вы можете пойти SELECT id,exam,exam_res FROM exam INNER JOIN search_exam USING(exam)
.
Счастливые игры - Marco здравомыслящего
Execute 'выбрать (случайные() * 5 + 1)' несколько раз, и вы можете увидеть проблему. Я сомневаюсь, что любое из значений, которые вы увидите, будет равно любым значениям «Exam.exam». –
Вы должны задать другой вопрос с данными образца и желаемыми результатами. Этот код, вероятно, не тот, который вы хотите сделать. –