首页 > 解决方案 > 如何在 SQL 中以随机顺序打乱行并将结果保存在新表中?

问题描述

所以我有一张名为“客户”的表

                     id  | name
                    ------------
                     1     Tom
                     2     Bob
                     3     Sam
                     4     Angel
                     5     Joe

我想以随机顺序选择“名称”列中的行,并将这些行插入到新表中,我试过了

       select Name into TestTable from Customer order by NEWID() 
       select * from TestTable

但它不起作用?TestTable 中的行与它们在原始表中的顺序相同。

                         Tom
                         Bob
                         Sam
                         Angel
                         Joe

我尝试执行多次,但每次结果都相同。似乎在随机化发生之前将行插入到新表中。有任何想法吗?

标签: sqlsql-serverrandom

解决方案


表中的行没有顺序。它们代表无序集。如果您希望行以随机顺序排列,则在提取它们时进行排序:

select name
from testtable
order by newid();

或者,您可以添加一identity列,该列应保留以下的顺序group by

select identity(int) as id, Name
into TestTable
from Customer order by NEWID();

select *
from TestTable
order by id;

是一个 db<>fiddle。

注意:我真的很惊讶您的示例不适用于一小组数据。我可能猜想这是 SQL Server 为避免对数据进行排序而实现的优化,因为它知道表是无序的。但是,该identity()功能已记录在案以保留顺序。


推荐阅读