Sql 通过在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

我已经创建了一个生成一系列数字的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

之所以要获得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