Как объединить 2 таблицы без общего ключа и случайным образом сгенерировать строки второй таблицы - PullRequest
1 голос
/ 08 января 2020

У меня есть 2 таблицы .. [Пользователи] и [Вопросы]

Таблица пользователей имеет ..

UserId Name
--     ----
1      Bob
2      Ang
3      Bill

И Таблица вопросов имеет ..

QuestId Description CategoryId
------- ----------  --------
0       Question0   1
1       Question1   1
2       Question2   1
3       Question3   1
4       Question4   1
5       Question5   1
6       Question6   1
7       Question7   1
8       Question9   1
9       Question9   1
10      Question10  2

Теперь я хочу выбрать 5 случайных вопросов для каждого [пользователя].

Я пробовал этот запрос ..

SELECT [User].UserId,Name, QuestId, Description from Users OUTER APPLY 
(SELECT TOP 5 QuestId, Description FROM Question WHERE CategoryId=1 ORDER BY NEWID(), 
Question.Id) RandomQuestions

И в результате он выглядит примерно так. .

UserId Name QuestId Description
------ ---- ------- -----------
1      Bob  2       Question2
1      Bob  3       Question3
1      Bob  6       Question6
1      Bob  8       Question8
1      Bob  9       Question9

2      Ang  2       Question2
2      Ang  3       Question3
2      Ang  6       Question6
2      Ang  8       Question8
2      Ang  9       Question9

3      Bill 2       Question2
3      Bill 3       Question3
3      Bill 6       Question6
3      Bill 8       Question8
3      Bill 9       Question9

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

Ответы [ 2 ]

3 голосов
/ 08 января 2020

Используйте это:

SELECT UserId,Name,QuestId, Description
FROM   Users  a
CROSS apply (
SELECT TOP 5 Row_number() OVER(ORDER BY (SELECT NULL)) AS RowNo, *
            FROM   (SELECT TOP 5 QuestId, Description
                    FROM   Question  b
                    WHERE  a.UserId = a.UserId 
                    ORDER  BY Newid()) S
) cs 
0 голосов
/ 08 января 2020

Вам нужно случайным образом QuestionID, как это

WHERE QuestId = (ABS(CHECKSUM(NEWID()) % 10)) + 1
...