问题 在SQL Server中的更新语句中使用随机记录更新表?


我有两张桌子。 Table 1 有大约80行和 Table 2 有大约1000万。

我想更新所有行 Table 2 从中随机排 Table 1。我不希望所有行都有相同的行。是否可以更新 Table 2 并让它为它正在更新的每一行随机选择一个值?

这是我尝试过的,但它在每一行中都有相同的值。

update member_info_test
set hostessid = (SELECT TOP 1 hostessId FROM hostess_test ORDER BY NEWID())

**编辑


1962
2017-10-25 20:40


起源

这将指出您正确的方向: stackoverflow.com/questions/19412/... - Landjea
你不想要一个相同的记录?第一个表有80并且要更新的表有10M记录时很困难。 - Tim Schmelter
并非每条记录都有相同的记录。我只是希望它使用那一张表中的80条记录 - chobo
你需要做更新吗?你能删除所有记录并插入吗? - Abe Miessler
我需要做一个更新:( - chobo


答案:


好吧,我认为这是我写过的最奇怪的查询之一,我认为这将是非常缓慢的。但试一试:

UPDATE A
SET A.hostessid = B.hostessId
FROM member_info_test A
CROSS APPLY (SELECT TOP 1 hostessId
             FROM hostess_test 
             WHERE A.somecolumn = A.somecolumn
             ORDER BY NEWID()) B

15
2017-10-25 20:53



值都是一样的:( - chobo
@chobo - 真的吗?,我用样本数据对它进行了测试,结果很好。但要获得不同的价值, WHERE A.somecolumn = A.somecolumn 是强制性的 - Lamak
我不知道为什么它适合你,但我在每一行都得到相同的值 - chobo
实际上这个查询有点可行,但令我困惑的是Where A.somecolumn = A.somecolumn。根据我使用的列,我似乎得到不同的结果 - chobo
似乎更不同的值A.someColumn具有更随机的结果 - chobo


我认为这会起作用(至少,这个 with 部分确实):

with toupdate as (
      select (select top . . . hostessId from hostess_test where mit.hostessId = mit.hostessId order by newid()) as newval,
             mit.*
      from member_info_test mit
     )
update toupdate
    set hostessid = newval;

这个(和Lamak的)的关键是子查询中的外部相关性。这说服优化器实际运行每行的查询。我不知道为什么这会起作用而另一个版本不会。


1
2017-10-25 21:10



如果你把1放在哪里 . . . 是的,那么它应该工作。知道为什么我不能插入这段代码吗? - Gordon Linoff
看到 这个Connect项目。 - Paul White
这在SQL2012中对我来说很好;我不得不省略 mit 别名 update 然而,部分。总而言之,这是一个一次性问题的良好,合乎逻辑的解决方案。 - Paul Suart


以下是我最终使用的内容:

EnvelopeInformation将是您的表2

PaymentAccountDropDown将是你的表1(在我的情况下我有3个项目) - 为你的用例改变3到80。

;WITH cteTable1 AS (
    SELECT
        ROW_NUMBER() OVER (ORDER BY NEWID()) AS n,
        PaymentAccountDropDown_Id
    FROM EnvelopeInformation
    ),
cteTable2 AS (
    SELECT 
        ROW_NUMBER() OVER (ORDER BY NEWID()) AS n,
        t21.Id
    FROM PaymentAccountDropDown t21
    )
UPDATE cteTable1
   SET PaymentAccountDropDown_Id = (
       SELECT Id 
       FROM cteTable2
       WHERE  (cteTable1.n % 3) + 1 = cteTable2.n
)

参考: http://social.technet.microsoft.com/Forums/sqlserver/pt-BR/f58c3bf8-e6b7-4cf5-9466-7027164afdc0/updating-multiple-rows-with-random-values-from-another-table


0
2017-09-23 20:25





使用随机字段更新表

UPDATE p
    SET p.City= b.City
    FROM Person p
    CROSS APPLY (SELECT TOP 1 City
                 FROM z.CityStateZip 
                 WHERE p.SomeKey = p.SomeKey and -- ... the magic! ↓↓↓
                 Id = (Select ABS(Checksum(NewID()) % (Select count(*) from z.CityStateZip)))) b

0
2018-05-27 16:45