通过加入CTE插入不产生随机结果

时间:2014-03-08 04:57:21

标签: 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   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

2 个答案:

答案 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