2016-11-08 2 views
1

Мне нужен sql-запрос, который будет случайным образом выбирать 20 записей из таблицы, содержащей около 100 записей. Каждая запись имеет связанную категорию, которая идет от 1 до 15. Я хочу, чтобы записи, которые были выбраны, были полностью случайными. Однако у меня не может быть 3 записи из той же категории.Как написать запрос доступа к Microsoft SQL, который выбирает 20 случайных записей из 100, но фильтрует по категориям записей?

Мне кажется, что я могу случайным образом выбрать 20 записей, а затем исключить записи, содержащие данную категорию> = 3 раза. И затем снова выберите. Но все это подразумевает наличие нескольких запросов. И я не знаю, как передавать результаты одного запроса другому, а затем еще один запрос на доступ к Microsoft. Предполагается, что результаты запроса служат источником управления для формы. Что я делаю так, чтобы только один запрос дал мне результаты, которые затем могут быть использованы в качестве источника управления для формы?

Я пробовал следующее, и проблема в том, что вопросы из той же категории сгруппированы вместе, что не то, что я хочу. Вот пример того, что я пытаюсь.

`(SELECT TOP 3 MCQuestionsT.QuestionID, MCQuestionsT.QuestionText, MCQuestionsT.CategoryID 
FROM MCQuestionsT 
WHERE (((MCQuestionsT.CourseCode)="2323") AND MCQuestionsT.CategoryID = 1) 
ORDER BY Rnd(MCQuestionsT.QuestionID)) 
UNION ALL 
(SELECT TOP 3 MCQuestionsT.QuestionID, MCQuestionsT.QuestionText, MCQuestionsT.CategoryID 
FROM MCQuestionsT 
WHERE (((MCQuestionsT.CourseCode)="2323") AND MCQuestionsT.CategoryID = 2) 
ORDER BY Rnd(MCQuestionsT.QuestionID)) 
UNION ALL 
(SELECT TOP 3 MCQuestionsT.QuestionID, MCQuestionsT.QuestionText, MCQuestionsT.CategoryID 
FROM MCQuestionsT 
WHERE (((MCQuestionsT.CourseCode)="2323") AND MCQuestionsT.CategoryID = 3) 
ORDER BY Rnd(MCQuestionsT.QuestionID)) 

` 
+0

Почему бы не использовать 'RAND()' в процедуре VBA, чтобы выбрать строки, а затем построить и выполнить специальный SQL заявление? – MoondogsMaDawg

ответ

0
-- example using sys.all_objects that returns three random objects of each type 
SELECT type_desc, name 
FROM (
    SELECT type_desc, name, Id = ROW_NUMBER() OVER (PARTITION BY type_desc ORDER BY NEWID()) 
    FROM sys.all_objects 
) Q 
WHERE Id < 4 

-- example using your table 
SELECT QuestionID, QuestionText, CategoryID 
FROM (
    SELECT QuestionID, QuestionText, CategoryID, Id = ROW_NUMBER() OVER (PARTITION BY CategoryID ORDER BY NEWID()) 
    FROM dbo.MCQuestionsT 
    WHERE CourseCode = '2323' 
) Q 
WHERE Id < 4 
+0

Это не работает. В любом случае он не работает в sql доступа. Поле «id» отсутствует. Вы имеете в виду категорию? –

+0

Поддерживает ли Access функцию row_number()? –

Смежные вопросы