2016-03-03 54 views
0

我想从2个表中随机选择N个行数。我的第一个表是这样的: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 
+0

如果您试图随机选择问题,为什么使用TOP?这总会给你同样的三个问题。 –

+0

我完全不明白你的问题。您的示例查询将输出2行,而不是1,''Nothing,Something''不在'answer_text'的示例值中。 –

+0

我同意,你是否真的想为每个答案一行,或者你想在每个问题的一行中连接所有可能的答案串? – Devon

回答

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 ...子查询。

0

使用此答案,它将在您选择的范围内生成3个随机数,选择与这些值相关的问题,然后从答案表中提供答案和这些ID。这个答案的问题是,它可能会产生重复的值。这可以用联合来解决。

DECLARE @MIN INT = 1 
DECLARE @MAX INT = 100 
DECLARE @rand1 INT = (SELECT CAST(((@[email protected]) * RAND() + @min) AS INT)) 
DECLARE @rand2 INT = (SELECT CAST(((@[email protected]) * RAND() + @min) AS INT)) 
DECLARE @rand3 INT = (SELECT CAST(((@[email protected]) * 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 
-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 
+0

虽然这是执行此操作的“标准”方式,但极不推荐,因为在场景后面,您将每行的GUID关联起来,并且分类可能会花费很高(CPU ,内存和I/O)。请考虑阅读以下内容:https://msdn.microsoft.com/en-us/library/cc441928.aspx。 –

+0

当然,但在这种情况下,所讨论的表格听起来相对较小,并且'newID'解决方案比使用'rand'的建议解决方案更简单和更灵活。由于问题涉及选择可变数量的行,我认为一个允许容易调整该变量的解决方案是最合适的。 – APH

0

你需要随机quesitons,然后加入到答案。加入到答案是微不足道的。要获得随机问题,您可以使用ID,因为它们是整数,但如果您使用了身份,则它们可能不是连续的。为此,取决于SQL Server的版本,您可以使用ROW_NUMBER函数:

select q_id 
from 
(select 
    row_number() over(ORDER BY q_id) as Row, 
    q_id 
from questions) q 
where Row in ((select CAST(RAND() * (select COUNT(q_id) from questions) + 1 as int)), 
    (select CAST(RAND() * (select COUNT(q_id) from questions) + 1 as int))) 

由于我们是拉两个随机数,你会看到两个记录。然后加入以获得其余的数据