我创建了一个产生一系列数字的cte。
我想要做的是加入此表并使用随机选择的值进行插入,这都是为了生成测试数据。
插入的随机部分看起来像这样:
(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
答案 0 :(得分:1)
您获得相同记录100次的原因是SELECT TOP 1 Name FROM @Titles ORDER BY NEWID()
仅执行一次,然后针对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
答案 1 :(得分:1)
正如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 表中检查您的结果。
SELECT * FROM MyTable