Sql 通过在CTE上连接进行插入,不会产生随机结果
我已经创建了一个生成一系列数字的cte 我想做的是在这个表上连接并使用随机选择的值进行插入,这都是为了生成测试数据 插入的随机部分如下所示:Sql 通过在CTE上连接进行插入,不会产生随机结果,sql,sql-server,common-table-expression,Sql,Sql Server,Common Table Expression,我已经创建了一个生成一系列数字的cte 我想做的是在这个表上连接并使用随机选择的值进行插入,这都是为了生成测试数据 插入的随机部分如下所示: (SELECT TOP 1 Name FROM @Titles ORDER BY NEWID()) 问题是,当我在CTE上进行插入和连接时,我的结果似乎一点也不随机?它总是使用@Titles中的相同值?还有其他一些表格,比如@Notes WITH MyCte AS (SELECT MyCounter = 1 UNION ALL
(SELECT TOP 1 Name FROM @Titles ORDER BY NEWID())
问题是,当我在CTE上进行插入和连接时,我的结果似乎一点也不随机?它总是使用@Titles中的相同值?还有其他一些表格,比如@Notes
WITH MyCte AS
(SELECT MyCounter = 1
UNION ALL
SELECT MyCounter + 1
FROM MyCte
where MyCounter < 100)
INSERT INTO [MyTable]
( Title, Note )
select (SELECT TOP 1 Name FROM @Titles ORDER BY NEWID()),
(SELECT TOP 1 Note FROM @Notes ORDER BY NEWID())
from mycte
之所以要获得100次相同的记录,是因为从@Titles ORDER BY NEWID中选择TOP 1 Name只执行一次,然后在mycte中为每条记录返回 您可以使用一个好的旧循环来实现您想要的。您可以将其用于多个表。源表中有多少条记录并不重要,但至少应该有1条记录
declare @count int = 100
while @count > 0
begin
INSERT INTO [MyTable] ( Title )
SELECT TOP 1 Name FROM @Titles ORDER BY NEWID()
INSERT INTO [MyTable] ( Title )
SELECT TOP 1 Note FROM @Notes ORDER BY NEWID()
set @count = @count - 1
end
正如Szymon在他的回答中所说,没有必要使用CTE从表中随机获取100条记录。因此,除了Szymon给出的答案外,您还可以使用下面的查询实现相同的结果
INSERT INTO [MyTable] ( Title )
SELECT TOP 1 Name FROM @Titles ORDER BY NEWID()
Go 100
指定多个表的步骤
INSERT INTO [MyTable] ( Title, Note )
SELECT (SELECT TOP 1 Name FROM @Titles ORDER BY NEWID()),
(SELECT TOP 1 Name FROM @Notes ORDER BY NEWID())
GO 100
现在在MyTable中检查您的结果
你想以随机顺序插入@Titles中的所有值,还是即使@Titles中的记录较少,你也总能得到100条记录?因为只有少数记录,所以这是行不通的。还有多个像Titles这样的假表,我需要从其中几个表中获取值。@shenku好的,将解决方案改为使用循环。我更新了我的问题,还有多个测试数据表。看见Notes@shenku-我已经更新了我的答案。。。请检查并评论。非常感谢。
SELECT * FROM MyTable