【问题标题】:How to join 2 tables without common key and randomly generate rows of second table如何在没有公共键的情况下连接 2 个表并随机生成第二个表的行
【发布时间】:2020-04-25 14:18:17
【问题描述】:

我有 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

现在,我想要的是,为每个 [User] 随机选择 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 是随机生成的,但如果您注意到,每个用户都有相同的随机生成问题。我希望每个用户都有不同的随机问题集。

【问题讨论】:

标签: sql sql-server database join outer-apply


【解决方案1】:

你需要像这样随机QuestionID

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

【讨论】:

    【解决方案2】:

    使用这个:

    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 
    

    【讨论】:

    • 嗨@Shusang,你的回答很完美。但我对它很感兴趣。为什么每当我删除“a.UserId = a.UserId”时,结果是,每个用户再次生成相同的问题。你能解释一下为什么会这样吗?另外,Row_number() 的目的是什么?因为当我删除它时,什么都没有改变。结果相同。
    • 嗨@Jhe,我们提供了“用户 a”记录的参考,以便与“问题 b”交叉应用加入,因此所有基于用户的结果都显示在前 5 位。如果您不需要,则无需使用 Row_number() 。仅用于显示用户明智的问题编号。
    猜你喜欢
    • 1970-01-01
    • 2021-12-07
    • 2020-05-12
    • 1970-01-01
    • 2020-10-12
    • 1970-01-01
    • 2018-09-19
    • 1970-01-01
    相关资源
    最近更新 更多