SQL Server - 从2个表中选择N个随机行

时间:2016-03-03 18:52:13

标签: sql sql-server

我试图从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

4 个答案:

答案 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