【问题标题】:update table with random values用随机值更新表
【发布时间】:2011-04-28 00:37:45
【问题描述】:

我有两个表,比如说 Table1(Col1,Col2,Col3,Col4) 和 Table2(Col1)。

我想更新 Table1 中的一些列。

对于 Table1 中 Col1 以“001”结尾的每一行(假设所有值的长度至少为 4)我想:

1. 将一个随机数从集合 (10,20,30,40,50,60,70,80,90) 中放入 Col2。

2. 在 Col3 中放置一个随机的 9 位数字。

3.将Table2 Col1中的一个随机值放入Table1 Col4中。

我该怎么做?

谢谢!

【问题讨论】:

    标签: sql sql-server tsql random


    【解决方案1】:

    创建表 MyTable( RowID int IDENTITY(1, 1),
    Col1 整数, Col2 整数, Col3 整数, Col4 整数。 )

    DECLARE @RowCount int,
    @numberRecords int
    
    select @NumberRecords = count(*) from mytable
    SET @RowCount = 1
    
    WHILE @RowCount <= @NumberRecords
    BEGIN
    
    UPDATE MyTable
     SET  Col1 = (SELECT TOP 1 RandomColumn1 
             FROM   SampleData 
             ORDER BY NEWID()) 
    
     WHERE RowID = @RowCount
    
    
     SET @RowCount = @RowCount + 1
    END
    

    希望对您有所帮助.. 扩展我的答案.. 如您所见,我创建了您的表,但添加了一个递增的 row-id 列.. 然后我创建了一个循环,在每行上运行更新语句行基础。

    与光标的功能非常相似,但希望更快。

    【讨论】:

    • 在您发布此内容之前,我实际上开发了一个基于集合的解决方案。非常感谢你的帮助! +1
    【解决方案2】:

    我认为这可以让你走上正确的道路。

    建立一个样本数据表,其中包含满足您需求的递增数字。您可以使用循环,但如果您执行多行,tally tablea recursive CTE 会快得多。然后,用样本数据ORDER BY NEWID() 更新Table1 的相应列。这将随机化选择集的顺序。

    UPDATE Table1
    SET  Col1 = (SELECT TOP 1 RandomColumn1
                 FROM   SampleData
                 ORDER BY NEWID())
    

    您还可以查看 RedGate's Data Generator 是否适合您。我有,但没用过。

    【讨论】:

    • 不能在子查询中使用 order by 子句,除非您使用 top1 并且这会导致在每条记录中放置相同的随机值。
    • @kralco,添加TOP 1不会在每个字段中放置相同的值,因为指定了ORDER BY NEWID()。但是,我正在根据您的其他观察进行修改(在没有TOP 的子查询中不能有ORDER BY
    • @kralco,我明白了;一定是因为TOP 1 查询只执行了一次。当我只测试该语句时,每次执行都会收到不同的结果。
    • @kralco,在研究解决方案时,我遇到了很多限制,需要创建大量依赖项(TALLY TABLEVIEWfor 获得 NEWID()、@ 987654335@ 生成随机数)。我会去别处看看;抱歉,我帮不上忙。
    • Top 1 查询将只运行一次并根据它返回的值更新列。在我的脑海中,您可以创建一个 RowID 列(递增数字)获取列的最小值/最大值,您在其中更新并使用 while 1:1 循环每次递增一个计数器变量,直到您达到与您的值相同的值最大行 ID。
    【解决方案3】:

    我宁愿运行下面的代码并等待某个时间运行和更新随机值

    while 1=1
    BEGIN
        UPDATE top (10) a
         SET  value =rand() * 100
        from (select top 10 * from 
                MyTable
         order by newid()
         ) a
    END
    

    【讨论】:

      【解决方案4】:

      我更喜欢始终使用基于集合的解决方案。这是我开发的基于集合的解决方案。我测试了它,它可以工作。

      Update Table1
         Set Col2 = (Cast(CAST(newid() AS binary(1)) AS int) % 9 + 1) *10
       Where Substring(Table1.Col1,len(Table1.Col1)-2,3) = '001'
      
      Update Table1
         Set Col3 = Cast(CAST(newid() AS binary(3)) AS int)
       Where Substring(Table1.Col1,len(Table1.Col1)-2,3) = '001'
      
      Create table #temp1(tCol1 varchar(50), 
                   tCol2 varchar(10),randomnum varchar(max) )
      
            Insert Into #temp1
            Select Table1.Col1,Table2.Col1,newid() as random1
              From Table1 
        Cross Join Table2 
             Where Substring(Table1.Col1,len(Table1.Col1)-2,3) = '001'
      
            Update Table1
               Set Table1.Col4 = tCol2
              From (
                    Select tCol1,tCol2,a.randomnum 
                      From (
                                 Select Max(randomnum) As randomnum 
                                   From #temp1 Group By tCol1
                           ) a 
                 Left Join #temp1 On a.randomnum = #temp1.randomnum
                   ) b  
                Inner Join Table1 On b.tCol1 = Table1.Col1
      
                Drop table #temp1
      

      【讨论】:

      • “这是基于集合的解决方案”:您正在使用三个更新和一个临时表。呃,这不是程序方法吗?
      • 好吧,我只更新了 350 行,我觉得没有必要合并为一个步骤。但是,如果它对某人有帮助,我当然可以……还有。暂存表是不可避免的,除非使用 With table.... 临时表或表变量或任何它被称为的任何方式在逻辑上都是相同的。有必要多次引用非确定性查询的同一实例。你必须把它保存在某个地方......
      【解决方案5】:

      我倾向于使用这样的东西:

      WITH SampleData (entity_number, entity_name)
           AS (
               ... row constructors here...
              ),
           SampleDataOrdered (order_col, entity_number, entity_name)
           AS (
               SELECT ROW_NUMBER() OVER(ORDER BY NEWID()), 
                      S1.entity_number, S1.entity_name
                 FROM SampleData AS S1
              )
      MERGE INTO MyBaseTable...;
      

      【讨论】:

      • 我想弄清楚你的意思。你能更具体一点吗?如何使用 table2 col1 中的随机值更新 table1 col4?谢谢!
      猜你喜欢
      • 2012-10-09
      • 1970-01-01
      • 2015-08-12
      • 2015-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-04
      • 1970-01-01
      相关资源
      最近更新 更多