【问题标题】:Inserting by joining on CTE not producing random results通过加入 CTE 插入不会产生随机结果
【发布时间】:2014-03-08 04:57:21
【问题描述】:

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

【问题讨论】:

  • 您是要以随机顺序插入来自@Titles 的所有值,还是总是得到100 条记录(即使@Titles 中的记录较少)?

标签: sql sql-server common-table-expression


【解决方案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

【讨论】:

  • 只有少数记录,所以这行不通。
  • 还有多个假表,比如 Titles,我需要从其中的几个中获取值。
  • @shenku 好的,然后将解决方案更改为使用循环。
【解决方案2】:

正如 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

【讨论】:

  • 我已经更新了我的问题,还有不止一个测试数据表。见注释
  • @shenku - 我已经更新了我的答案...请检查并发表评论。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-13
  • 1970-01-01
  • 2012-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-20
相关资源
最近更新 更多