2012-09-20 41 views
3

我有2個表格:Persons(idPerson INT)Questions(idQuestion INT)SQL隨機在加入表中排序

我希望將數據插入到第三臺:OrderedQuestions(idPerson INT, idQuestion INT, questionRank INT)

我要分配所有的問題,所有的人,但在一個隨機順序。

我想過做一個CROSS JOIN,但是後來,我得到了每個人的相同問題順序。

INSERT INTO OrderedQuestions 
    SELECT idPerson, idQuestion, questionRank FROM Persons 
    CROSS JOIN 
    (SELECT idQuestion,ROW_NUMBER() OVER (ORDER BY NEWID()) as questionRank 
    FROM Questions) as t 

我該如何爲每個人實現這樣一個隨機的,不同的排序?

顯然,我希望解決方案儘可能快。 (它可以使用T-SQL或LINQ到SQL來完成)


3人期望的結果和5個問題:

idPerson   idQuestion   questionRank 
1. 1    18     1 
2. 1    14     2 
3. 1    25     3 
4. 1    31     4 
5. 1    2     5 
6. 2    2     1 
7. 2    25     2 
8. 2    31     3 
9. 2    18     4 
10. 2    14     5 
11. 3    31     1 
12. 3    18     2 
13. 3    14     3 
14. 3    25     4 
15. 3    2     5 

我剛纔編輯的結果(因爲ID是自動生成的,他們可以不會用於排序問題)。

+0

我不認爲這是可能的與CROSS JOIN所以不要猶豫,嘗試不同的解決方案,使用CURSORS或任何東西! –

+0

使用2'ORDER BY NEWID()'發佈答案的人接近,但使用180個問題和560個人,每個問題只分配8個不同的等級。 –

回答

2

這可能會寫得更有效,但它符合所有的要求。

SELECT 
    idperson, 
    idQuestion, 
    ROW_NUMBER() OVER (PARTITION BY personid ORDER BY ordering) as questionRank 
FROM (
    SELECT idperson, idQuestion, ordering 
    FROM person 
    CROSS JOIN 
    (
     SELECT idQuestion, NewID() as ordering FROM Question 
    ) as t 
) as a 
order by personid, QuestionRank 
+0

完美。我會投這20次。 (關於效率,它在半秒內插入100K行)謝謝! –

+0

太棒了!很高興我能幫上忙! – jTC