如何在插入后打乱 SQL Server 表中的行?由于某些原因,Newid 无法按预期工作

问题描述 投票:0回答:2

我目前正在使用 SQL 查询从两个表中检索数据并将其存储到名为

@folderTable
的临时表中。我想打乱结果中的所有行,以便整行的数据是随机的

这是我的查询的简化版本:

DECLARE @folderTable TABLE (FolderId int, QuestionsPerExam int, AvailableQuestions int);

INSERT INTO @folderTable (FolderId, QuestionsPerExam, AvailableQuestions)
    SELECT f.id, f.questions_per_exam, COUNT(q.id)
    FROM tbl_mcq_folder f
    LEFT JOIN tbl_mcq_questions q ON q.folder_id = f.id
    WHERE f.collaborator_id = 5 AND f.status = 1
    GROUP BY f.id, f.questions_per_exam
    ORDER BY NEWID();

执行此操作后,我希望

@folderTable
中的行被随机化,类似于:

随机播放前:

文件夹ID 每次考试的问题 可用问题
1 5 10
2 3 15
3 7 20

随机播放后:

文件夹ID 每次考试的问题 可用问题
2 3 15
1 5 10
3 7 20

我尝试使用

ORDER BY NEWID()
,但它似乎没有在我的临时表上下文中按预期工作。

有没有办法打乱

@folderTable
中的所有行,以便每行数据以随机顺序出现?

sql sql-server
2个回答
2
投票

这里要理解的关键概念是 SQL 表基于“无序”记录集。 插入后 @folderTable 中的记录没有固有的内部顺序。 如果您想以随机顺序

查看
数据,则应在选择中使用NEWID()而不是插入:
SELECT FolderId, QuestionsPerExam, AvailableQuestions
FROM @folderTable
ORDER BY NEWID();

请注意,当前插入语句中的 
ORDER BY NEWID()

本质上是无操作,尽管它可能会使插入速度变慢。

    


-1
投票

© www.soinside.com 2019 - 2024. All rights reserved.