我试图从2个表中随机选择N行。我的第一张表看起来像这样:
q_id | question_text
-----------------
1 | What am I doing?
2 | Who are you?
3 | Hmm?
我加入的表格如下:
a_id | q_id | answer_text
-------------------------
1 | 1 | Nothing
2 | 1 | Something
3 | 2 | Mike
4 | 2 | Steve
5 | 2 | Jon
6 | 3 | Yup
7 | 3 | Nope
我想用他们的答案输出一个随机问题。因此,如果我有50行,我可以选择例如前3行,它会输出3个随机问题,但有很多答案。
这是我一直在使用的查询但是当我使用TOP(2)时,它只获得前2个答案而不是前2个问题:
查询:
SELECT TOP(2) q.q_id, q.question_text, a.answer_text
FROM question q
INNER JOIN answers a ON q.q_id= a.q_id
目前的结果:
2 | Who are you? | Mike, Steve
预期结果:
1 | What am I doing? | Nothing, Something
3 | Who are you? | Mike, Steve, Jon
答案 0 :(得分:1)
这会让你更接近 - 注意它不会神奇地用逗号分隔答案并将它们放在一行,但它至少会给你两个完整的问题。您可以(也可能应该)在表示层中执行以逗号分隔的内容。
SELECT
q.q_id,
q.question_text,
a.answer_text
FROM question q
INNER JOIN answers a ON q.q_id = a.q_id
WHERE q.q_id IN (SELECT TOP 2 q_id FROM question);
如果您想出一种更随机的方式来指定问题ID,您可以将其替换为WHERE q.q_id IN ...
子查询。
答案 1 :(得分:0)
通过这个答案,它将在您选择的范围之间生成3个随机数,选择与这些值相关的问题,然后从答案表中提供这些ID的答案。这个答案的问题在于,它可能会生成重复的值。这可以通过联合来解决。
DECLARE @MIN INT = 1
DECLARE @MAX INT = 100
DECLARE @rand1 INT = (SELECT CAST(((@max-@min-1) * RAND() + @min) AS INT))
DECLARE @rand2 INT = (SELECT CAST(((@max-@min-1) * RAND() + @min) AS INT))
DECLARE @rand3 INT = (SELECT CAST(((@max-@min-1) * RAND() + @min) AS INT))
SELECT q.question_text, a.answer_text
FROM question_table q
INNER JOIN answer_table a
ON q.q_id = a.q_id
WHERE q.q_id IN(@rand1, @rand2, @rand3)
ORDER BY q.q_id, a.a_id
答案 2 :(得分:0)
你需要随机问题,然后加入答案。加入答案是微不足道的。要获得随机问题,您可以使用ID,因为它们是整数,但如果您使用了身份,那么它们可能不是连续的。因此,根据SQL Server的版本,您可以使用row_number函数:
run {
standardInput = System.in
}
由于我们要拉两个随机数,你应该得到两个记录。然后加入以获取其余数据
答案 3 :(得分:-1)
您可以使用newID()
选择随机数量的问题,如下所示:
declare @n int = 2 --set number of questions here
;with Question as (select top (@n) * from QuestionTable
order by newID())
select * from Question a
left join AnswerTable b
on a.q_id = b.q_id